github.com/mineiros-io/terradoc@v0.0.9-0.20220711062319-018bd4ae81f5/internal/validators/varsvalidator/varsvalidator.go (about)

     1  package varsvalidator
     2  
     3  import (
     4  	"github.com/mineiros-io/terradoc/internal/entities"
     5  	"github.com/mineiros-io/terradoc/internal/validators"
     6  )
     7  
     8  const CheckType = "variable"
     9  
    10  type variableValidationChecks map[string]variableValidation
    11  
    12  type variableValidation struct {
    13  	defined    entities.Variable
    14  	documented entities.Variable
    15  }
    16  
    17  func Validate(doc entities.Doc, varsFile entities.ValidationContents) validators.Summary {
    18  	summary := validators.Summary{Type: CheckType}
    19  
    20  	validationResult := validateVariables(doc.AllVariables(), varsFile.Variables)
    21  
    22  	for varName, check := range validationResult {
    23  		switch {
    24  		case check.defined.Name == "":
    25  			summary.MissingDefinition = append(summary.MissingDefinition, varName)
    26  		case check.documented.Name == "":
    27  			summary.MissingDocumentation = append(summary.MissingDocumentation, varName)
    28  		case !validators.TypesMatch(&check.defined.Type, &check.documented.Type):
    29  			summary.TypeMismatch = append(
    30  				summary.TypeMismatch,
    31  				validators.TypeMismatchResult{
    32  					Name:           varName,
    33  					DefinedType:    check.defined.Type.AsString(),
    34  					DocumentedType: check.documented.Type.AsString(),
    35  				},
    36  			)
    37  		}
    38  	}
    39  
    40  	return summary
    41  }
    42  
    43  func validateVariables(docVars, varFileVars []entities.Variable) variableValidationChecks {
    44  	result := variableValidationChecks{}
    45  
    46  	for _, tfVar := range docVars {
    47  		result[tfVar.Name] = variableValidation{documented: tfVar}
    48  	}
    49  
    50  	for _, fVar := range varFileVars {
    51  		val, ok := result[fVar.Name]
    52  		if !ok {
    53  			val = variableValidation{}
    54  		}
    55  		val.defined = fVar
    56  
    57  		result[fVar.Name] = val
    58  	}
    59  
    60  	return result
    61  }