manifests/helm.go (57 lines of code) (raw):
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
package manifests
import (
"embed"
"fmt"
"io/fs"
"path/filepath"
"strings"
"helm.sh/helm/v3/pkg/chart"
"helm.sh/helm/v3/pkg/chart/loader"
)
// LoadChart returns chart from current package's embed filesystem.
func LoadChart(componentName string) (*chart.Chart, error) {
return loadChart(FS, componentName)
}
// LoadChartFromEmbedFS returns chart from a given embed filesystem.
func LoadChartFromEmbedFS(targetFS embed.FS, componentName string) (*chart.Chart, error) {
return loadChart(targetFS, componentName)
}
func loadChart(targetFS embed.FS, componentName string) (*chart.Chart, error) {
files, err := getFilesFromFSRecursively(targetFS, componentName)
if err != nil {
return nil, fmt.Errorf("failed to get chart files: %w", err)
}
topDir := componentName + string(filepath.Separator)
bufFiles := make([]*loader.BufferedFile, 0, len(files))
for _, f := range files {
data, err := fs.ReadFile(targetFS, f)
if err != nil {
return nil, fmt.Errorf("failed to read file (%s): %w", f, err)
}
fname := filepath.ToSlash(strings.TrimPrefix(f, topDir))
bufFiles = append(bufFiles,
&loader.BufferedFile{
Name: fname,
Data: data,
},
)
}
return loader.LoadFiles(bufFiles)
}
func getFilesFromFSRecursively(targetFS embed.FS, componentName string) ([]string, error) {
files := make([]string, 0)
err := fs.WalkDir(targetFS, componentName,
func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if d.IsDir() {
return nil
}
files = append(files, path)
return nil
},
)
if err != nil {
return nil, err
}
return files, nil
}