mirror of https://github.com/open-feature/cli.git
63 lines
1.9 KiB
Go
63 lines
1.9 KiB
Go
// Package generate contains the top level functions used for generating flag accessors.
|
|
package generate
|
|
|
|
import (
|
|
"bytes"
|
|
"codegen/internal/filesystem"
|
|
"codegen/internal/flagkeys"
|
|
"codegen/internal/generate/manifestutils"
|
|
"codegen/internal/generate/types"
|
|
"fmt"
|
|
"path"
|
|
"path/filepath"
|
|
"text/template"
|
|
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
// GenerateFile receives data for the Go template engine and outputs the contents to the file.
|
|
// Intended to be invoked by each language generator with appropriate data.
|
|
func GenerateFile(funcs template.FuncMap, contents string, data types.TmplDataInterface) error {
|
|
contentsTmpl, err := template.New("contents").Funcs(funcs).Parse(contents)
|
|
if err != nil {
|
|
return fmt.Errorf("error initializing template: %v", err)
|
|
}
|
|
|
|
var buf bytes.Buffer
|
|
if err := contentsTmpl.Execute(&buf, data); err != nil {
|
|
return fmt.Errorf("error executing template: %v", err)
|
|
}
|
|
outputPath := data.BaseTmplDataInfo().OutputPath
|
|
fs := filesystem.FileSystem()
|
|
if err := fs.MkdirAll(filepath.Dir(outputPath), 0660); err != nil {
|
|
return err
|
|
}
|
|
f, err := fs.Create(path.Join(outputPath))
|
|
if err != nil {
|
|
return fmt.Errorf("error creating file %q: %v", outputPath, err)
|
|
}
|
|
defer f.Close()
|
|
writtenBytes, err := f.Write(buf.Bytes())
|
|
if err != nil {
|
|
return fmt.Errorf("error writing contents to file %q: %v", outputPath, err)
|
|
}
|
|
if writtenBytes != buf.Len() {
|
|
return fmt.Errorf("error writing entire file %v: writtenBytes != expectedWrittenBytes", outputPath)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Takes as input a generator and outputs file with the appropriate flag accessors.
|
|
// The flag data is taken from the provided flag manifest.
|
|
func CreateFlagAccessors(gen types.Generator) error {
|
|
bt, err := manifestutils.LoadData(viper.GetString(flagkeys.FlagManifestPath), gen.SupportedFlagTypes())
|
|
if err != nil {
|
|
return fmt.Errorf("error loading flag manifest: %v", err)
|
|
}
|
|
input := types.Input{
|
|
BaseData: bt,
|
|
}
|
|
return gen.Generate(input)
|
|
}
|