github.com/dahs81/otto@v0.2.1-0.20160126165905-6400716cf085/appfile/validate.go (about)

     1  package appfile
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/hashicorp/go-multierror"
     7  )
     8  
     9  // Validate validates the Appfile
    10  func (f *File) Validate() error {
    11  	var result error
    12  
    13  	// Basic checking for stanzas
    14  	if f.Application == nil {
    15  		result = multierror.Append(result, fmt.Errorf(
    16  			"'application' stanza required for Appfile"))
    17  	}
    18  	if f.Project == nil {
    19  		result = multierror.Append(result, fmt.Errorf(
    20  			"'project' stanza required for Appfile"))
    21  	}
    22  	if f.Infrastructure == nil {
    23  		result = multierror.Append(result, fmt.Errorf(
    24  			"'infrastructure' stanza required for Appfile"))
    25  	}
    26  
    27  	// Verify the application itself
    28  	if f.Application != nil {
    29  		if f.Application.Name == "" {
    30  			result = multierror.Append(result, fmt.Errorf(
    31  				"application: name is required"))
    32  		}
    33  		if f.Application.Type == "" {
    34  			result = multierror.Append(result, fmt.Errorf(
    35  				"application: type is required"))
    36  		}
    37  	}
    38  
    39  	// Validate the project
    40  	if f.Project != nil {
    41  		if f.Project.Name == "" {
    42  			result = multierror.Append(result, fmt.Errorf(
    43  				"project: name is required"))
    44  		}
    45  		if f.Project.Infrastructure == "" {
    46  			result = multierror.Append(result, fmt.Errorf(
    47  				"project: infrastructure is required"))
    48  		} else {
    49  			found := false
    50  			for _, i := range f.Infrastructure {
    51  				if i.Name == f.Project.Infrastructure {
    52  					found = true
    53  					break
    54  				}
    55  			}
    56  			if !found {
    57  				result = multierror.Append(result, fmt.Errorf(
    58  					"project: infra '%s' has no corresponding infrastructure stanza",
    59  					f.Project.Infrastructure))
    60  			}
    61  		}
    62  	}
    63  
    64  	return result
    65  }