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  }