github.com/mineiros-io/terradoc@v0.0.9-0.20220711062319-018bd4ae81f5/internal/parsers/docparser/header.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 parseHeader(headerBlocks hcl.Blocks) (entities.Header, error) { 13 switch { 14 case len(headerBlocks) == 0: 15 return entities.Header{}, nil 16 case len(headerBlocks) > 1: 17 return entities.Header{}, fmt.Errorf("parsing Terradoc header: expected 1 but documenta has %d header blocks", len(headerBlocks)) 18 } 19 20 headerBlock := headerBlocks[0] 21 22 headerContent, diags := headerBlock.Body.Content(docschema.HeaderSchema()) 23 if diags.HasErrors() { 24 return entities.Header{}, fmt.Errorf("parsing Terradoc header: %v", diags.Errs()) 25 } 26 27 header, err := createHeaderFromHCLAttributes(headerContent.Attributes) 28 if err != nil { 29 return entities.Header{}, fmt.Errorf("parsing header: %s", err) 30 } 31 32 // parse `badge` blocks 33 for _, badgeBlk := range headerContent.Blocks.OfType(badgeBlockName) { 34 badge, err := parseBadge(badgeBlk) 35 if err != nil { 36 return entities.Header{}, fmt.Errorf("parsing header badge: %s", err) 37 } 38 39 header.Badges = append(header.Badges, badge) 40 } 41 42 return header, nil 43 } 44 45 func parseBadge(badgeBlock *hcl.Block) (entities.Badge, error) { 46 // badge blocks are required to have a label as defined in the schema 47 name := badgeBlock.Labels[0] 48 49 badgeContent, diags := badgeBlock.Body.Content(docschema.BadgeSchema()) 50 if diags.HasErrors() { 51 return entities.Badge{}, fmt.Errorf("parsing badge: %v", diags.Errs()) 52 } 53 54 return createBadgeFromHCLAttributes(badgeContent.Attributes, name) 55 } 56 57 func createHeaderFromHCLAttributes(attrs hcl.Attributes) (entities.Header, error) { 58 header := entities.Header{} 59 60 // image 61 image, err := hclparser.GetAttribute(attrs, imageAttributeName).String() 62 if err != nil { 63 return entities.Header{}, err 64 } 65 header.Image = image 66 67 // url 68 url, err := hclparser.GetAttribute(attrs, urlAttributeName).String() 69 if err != nil { 70 return entities.Header{}, err 71 } 72 header.URL = url 73 74 return header, nil 75 } 76 77 func createBadgeFromHCLAttributes(attrs hcl.Attributes, name string) (entities.Badge, error) { 78 badge := entities.Badge{Name: name} 79 80 // image 81 image, err := hclparser.GetAttribute(attrs, imageAttributeName).String() 82 if err != nil { 83 return entities.Badge{}, err 84 } 85 badge.Image = image 86 87 // url 88 url, err := hclparser.GetAttribute(attrs, urlAttributeName).String() 89 if err != nil { 90 return entities.Badge{}, err 91 } 92 badge.URL = url 93 94 // url 95 text, err := hclparser.GetAttribute(attrs, textAttributeName).String() 96 if err != nil { 97 return entities.Badge{}, err 98 } 99 badge.Text = text 100 101 return badge, nil 102 }