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 }