github.com/YousefHaggyHeroku/pack@v1.5.5/internal/builder/label_manager.go (about) 1 package builder 2 3 import ( 4 "encoding/json" 5 "fmt" 6 7 "github.com/YousefHaggyHeroku/pack/internal/dist" 8 9 "github.com/YousefHaggyHeroku/pack/internal/stack" 10 ) 11 12 type LabelManager struct { 13 inspectable Inspectable 14 } 15 16 func NewLabelManager(inspectable Inspectable) *LabelManager { 17 return &LabelManager{inspectable: inspectable} 18 } 19 20 func (m *LabelManager) Metadata() (Metadata, error) { 21 var parsedMetadata Metadata 22 err := m.labelJSON(metadataLabel, &parsedMetadata) 23 return parsedMetadata, err 24 } 25 26 func (m *LabelManager) StackID() (string, error) { 27 return m.labelContent(stackLabel) 28 } 29 30 func (m *LabelManager) Mixins() ([]string, error) { 31 parsedMixins := []string{} 32 err := m.labelJSONDefaultEmpty(stack.MixinsLabel, &parsedMixins) 33 return parsedMixins, err 34 } 35 36 func (m *LabelManager) Order() (dist.Order, error) { 37 parsedOrder := dist.Order{} 38 err := m.labelJSONDefaultEmpty(OrderLabel, &parsedOrder) 39 return parsedOrder, err 40 } 41 42 func (m *LabelManager) BuildpackLayers() (dist.BuildpackLayers, error) { 43 parsedLayers := dist.BuildpackLayers{} 44 err := m.labelJSONDefaultEmpty(dist.BuildpackLayersLabel, &parsedLayers) 45 return parsedLayers, err 46 } 47 48 func (m *LabelManager) labelContent(labelName string) (string, error) { 49 content, err := m.inspectable.Label(labelName) 50 if err != nil { 51 return "", fmt.Errorf("getting label %s: %w", labelName, err) 52 } 53 54 if content == "" { 55 return "", fmt.Errorf("builder missing label %s -- try recreating builder", labelName) 56 } 57 58 return content, nil 59 } 60 61 func (m *LabelManager) labelJSON(labelName string, targetObject interface{}) error { 62 rawContent, err := m.labelContent(labelName) 63 if err != nil { 64 return err 65 } 66 67 err = json.Unmarshal([]byte(rawContent), targetObject) 68 if err != nil { 69 return fmt.Errorf("parsing label content for %s: %w", labelName, err) 70 } 71 72 return nil 73 } 74 75 func (m *LabelManager) labelJSONDefaultEmpty(labelName string, targetObject interface{}) error { 76 rawContent, err := m.inspectable.Label(labelName) 77 if err != nil { 78 return fmt.Errorf("getting label %s: %w", labelName, err) 79 } 80 81 if rawContent == "" { 82 return nil 83 } 84 85 err = json.Unmarshal([]byte(rawContent), targetObject) 86 if err != nil { 87 return fmt.Errorf("parsing label content for %s: %w", labelName, err) 88 } 89 90 return nil 91 }