github.com/mineiros-io/terradoc@v0.0.9-0.20220711062319-018bd4ae81f5/internal/parsers/docparser/outputs.go (about) 1 package docparser 2 3 import ( 4 "errors" 5 "fmt" 6 7 "github.com/hashicorp/hcl/v2" 8 "github.com/mineiros-io/terradoc/internal/entities" 9 "github.com/mineiros-io/terradoc/internal/parsers/hclparser" 10 "github.com/mineiros-io/terradoc/internal/schemas/docschema" 11 ) 12 13 func parseOutputs(outputBlocks hcl.Blocks) (outputs []entities.Output, err error) { 14 for _, outputBlk := range outputBlocks { 15 output, err := parseOutput(outputBlk) 16 if err != nil { 17 return nil, fmt.Errorf("parsing output: %s", err) 18 } 19 20 outputs = append(outputs, output) 21 } 22 23 return outputs, nil 24 } 25 26 func parseOutput(outputBlock *hcl.Block) (entities.Output, error) { 27 if len(outputBlock.Labels) != 1 { 28 return entities.Output{}, errors.New("output block does not have a name") 29 } 30 31 outputContent, diags := outputBlock.Body.Content(docschema.OutputSchema()) 32 if diags.HasErrors() { 33 return entities.Output{}, fmt.Errorf("parsing output: %v", diags.Errs()) 34 } 35 36 // output blocks are required to have a label as defined in the schema 37 name := outputBlock.Labels[0] 38 output, err := createOutputFromHCLAttributes(outputContent.Attributes, name) 39 if err != nil { 40 return entities.Output{}, fmt.Errorf("parsing output: %s", err) 41 } 42 43 return output, nil 44 } 45 46 func createOutputFromHCLAttributes(attrs hcl.Attributes, name string) (entities.Output, error) { 47 var err error 48 49 output := entities.Output{Name: name} 50 51 output.Description, err = hclparser.GetAttribute(attrs, descriptionAttributeName).String() 52 if err != nil { 53 return entities.Output{}, err 54 } 55 56 // type definition 57 output.Type, err = hclparser.GetAttribute(attrs, typeAttributeName).OutputType() 58 if err != nil { 59 return entities.Output{}, err 60 } 61 62 return output, nil 63 }