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  }