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  }