github.com/buildpacks/pack@v0.33.3-0.20240516162812-884dd1837311/pkg/buildpack/build_module_info.go (about)

     1  package buildpack
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/pkg/errors"
     7  
     8  	"github.com/buildpacks/pack/pkg/dist"
     9  )
    10  
    11  type ModuleInfos interface {
    12  	BuildModule() []dist.ModuleInfo
    13  }
    14  
    15  type FlattenModuleInfos interface {
    16  	FlattenModules() []ModuleInfos
    17  }
    18  
    19  type flattenModules struct {
    20  	modules []ModuleInfos
    21  }
    22  
    23  func (fl *flattenModules) FlattenModules() []ModuleInfos {
    24  	return fl.modules
    25  }
    26  
    27  type buildModuleInfosImpl struct {
    28  	modules []dist.ModuleInfo
    29  }
    30  
    31  func (b *buildModuleInfosImpl) BuildModule() []dist.ModuleInfo {
    32  	return b.modules
    33  }
    34  
    35  func ParseFlattenBuildModules(buildpacksID []string) (FlattenModuleInfos, error) {
    36  	var buildModuleInfos []ModuleInfos
    37  	for _, ids := range buildpacksID {
    38  		modules, err := parseBuildpackName(ids)
    39  		if err != nil {
    40  			return nil, err
    41  		}
    42  		buildModuleInfos = append(buildModuleInfos, modules)
    43  	}
    44  	return &flattenModules{modules: buildModuleInfos}, nil
    45  }
    46  
    47  func parseBuildpackName(names string) (ModuleInfos, error) {
    48  	var buildModuleInfos []dist.ModuleInfo
    49  	ids := strings.Split(names, ",")
    50  	for _, id := range ids {
    51  		if strings.Count(id, "@") != 1 {
    52  			return nil, errors.Errorf("invalid format %s; please use '<buildpack-id>@<buildpack-version>' to add buildpacks to be flattened", id)
    53  		}
    54  		bpFullName := strings.Split(id, "@")
    55  		idFromName := strings.TrimSpace(bpFullName[0])
    56  		versionFromName := strings.TrimSpace(bpFullName[1])
    57  		if idFromName == "" || versionFromName == "" {
    58  			return nil, errors.Errorf("invalid format %s; '<buildpack-id>' and '<buildpack-version>' must be specified", id)
    59  		}
    60  
    61  		bpID := dist.ModuleInfo{
    62  			ID:      idFromName,
    63  			Version: versionFromName,
    64  		}
    65  		buildModuleInfos = append(buildModuleInfos, bpID)
    66  	}
    67  	return &buildModuleInfosImpl{modules: buildModuleInfos}, nil
    68  }