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 }