github.com/mineiros-io/terradoc@v0.0.9-0.20220711062319-018bd4ae81f5/internal/parsers/docparser/references.go (about) 1 package docparser 2 3 import ( 4 "fmt" 5 6 "github.com/hashicorp/hcl/v2" 7 "github.com/mineiros-io/terradoc/internal/entities" 8 "github.com/mineiros-io/terradoc/internal/parsers/hclparser" 9 "github.com/mineiros-io/terradoc/internal/schemas/docschema" 10 ) 11 12 func parseReferences(referencesBlocks hcl.Blocks) ([]entities.Reference, error) { 13 switch { 14 case len(referencesBlocks) == 0: 15 return nil, nil 16 case len(referencesBlocks) != 1: 17 return nil, 18 fmt.Errorf("parsing references: expected at most 1 `references` block but got %d instead", len(referencesBlocks)) 19 } 20 21 referencesContent, diags := referencesBlocks[0].Body.Content(docschema.ReferencesSchema()) 22 if diags.HasErrors() { 23 return nil, fmt.Errorf("parsing references: %v", diags.Errs()) 24 } 25 26 return parseRefs(referencesContent.Blocks.OfType(refBlockName)) 27 } 28 29 func parseRefs(refBlocks hcl.Blocks) (refs []entities.Reference, err error) { 30 for _, refBlock := range refBlocks { 31 ref, err := parseRef(refBlock) 32 if err != nil { 33 return nil, err 34 } 35 36 refs = append(refs, ref) 37 } 38 39 return refs, nil 40 } 41 42 func parseRef(refBlock *hcl.Block) (entities.Reference, error) { 43 // reference blocks are required to have a label as defined in the schema 44 name := refBlock.Labels[0] 45 46 refContent, diags := refBlock.Body.Content(docschema.RefSchema()) 47 if diags.HasErrors() { 48 return entities.Reference{}, fmt.Errorf("parsing Terradoc `references`: %v", diags.Errs()) 49 } 50 51 value, err := hclparser.GetAttribute(refContent.Attributes, valueAttributeName).String() 52 if err != nil { 53 return entities.Reference{}, err 54 } 55 56 return entities.Reference{Name: name, Value: value}, nil 57 }