cmd/hub/manifest/flatten.go (135 lines of code) (raw):

// Copyright (c) 2022 EPAM Systems, Inc. // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. package manifest import ( "fmt" "log" "path/filepath" "github.com/epam/hubctl/cmd/hub/config" "github.com/epam/hubctl/cmd/hub/util" ) func FlattenParameters(parameters []Parameter, tag string) []Parameter { flattened := flattenParametersWithPrefix("", "", "", "", parameters) if config.Debug { if len(flattened) > 0 { log.Printf("Parameters flattened (%s):", tag) printParameters(flattened) } else { log.Printf("No parameters found in %s", tag) } } return flattened } func flattenParametersWithPrefix(prefix string, kind string, empty string, component string, parameters []Parameter) []Parameter { if len(parameters) == 0 { return []Parameter{} } flattened := make([]Parameter, 0) for _, parameter := range parameters { if parameter.Name == "" { util.Warn("Component `%s` parameter name is empty at prefix `%s`, value `%s`", component, prefix, parameter.Value) } // let pretend only leafs are important if len(parameter.Parameters) > 0 { nested := flattenParametersWithPrefix( fmt.Sprintf("%s%s.", prefix, parameter.Name), mergeField(kind, parameter.Kind), mergeField(empty, parameter.Empty), mergeField(component, parameter.Component), parameter.Parameters) flattened = append(flattened, nested...) } else { parameter.Name = fmt.Sprintf("%s%s", prefix, parameter.Name) if parameter.Kind == "" && kind != "" { parameter.Kind = kind } if parameter.Empty == "" && empty != "" { parameter.Empty = empty } if parameter.Component == "" && component != "" { parameter.Component = component } flattened = append(flattened, parameter) } } return flattened } func mergeField(base string, over string) string { out := base if over != "" { out = over } return out } func ComponentRefByName(components []ComponentRef, componentName string) *ComponentRef { for i, component := range components { name := ComponentQualifiedNameFromRef(&component) if name == componentName { return &components[i] } } return nil } func ComponentManifestByRef(componentsManifests []Manifest, component *ComponentRef) *Manifest { name := ComponentQualifiedNameFromRef(component) for _, componentsManifest := range componentsManifests { if name == ComponentQualifiedNameFromMeta(&componentsManifest.Meta) { return &componentsManifest } } return nil } func ComponentsNamesFromManifests(manifests []Manifest) []string { res := make([]string, len(manifests)) for i, v := range manifests { res[i] = ComponentQualifiedNameFromMeta(&v.Meta) } return res } func ComponentsNamesFromRefs(components []ComponentRef) []string { res := make([]string, len(components)) for i, v := range components { res[i] = ComponentQualifiedNameFromRef(&v) } return res } func ComponentQualifiedNameFromRef(ref *ComponentRef) string { return ref.Name } func ComponentQualifiedNameFromMeta(meta *Metadata) string { return meta.Name } func ComponentSourceDirNameFromRef(component *ComponentRef) string { return component.Name } func ComponentSourceDirFromRef(component *ComponentRef, stackBaseDir, componentsBaseDir string) string { dir := "" source := component.Source if source.Dir != "" { if !filepath.IsAbs(source.Dir) { dir = filepath.Join(stackBaseDir, source.Dir) } else { dir = source.Dir } } if dir == "" { if source.Git.LocalDir != "" { dir = filepath.Join(source.Git.LocalDir, source.Git.SubDir) if !filepath.IsAbs(dir) { dir = filepath.Join(componentsBaseDir, dir) } } else if source.Git.Remote != "" { dir = filepath.Join(componentsBaseDir, ComponentSourceDirNameFromRef(component), source.Git.SubDir) } } if dir == "" { log.Fatalf("No source directory set for component `%s`", ComponentQualifiedNameFromRef(component)) } if config.Trace { log.Printf("Component `%s` source dir: `%s`", ComponentQualifiedNameFromRef(component), dir) } return dir } func MakeParameters(names []string) []Parameter { params := make([]Parameter, 0, len(names)) for _, name := range names { params = append(params, Parameter{Name: name}) } return params }