riju/tools/template/template.go

89 lines
1.8 KiB
Go

package main
import (
"bytes"
"fmt"
"io/fs"
"os"
"path/filepath"
"strings"
"text/template"
"github.com/Masterminds/sprig/v3"
"gopkg.in/yaml.v2"
)
func findProjectRoot() (string, error) {
curDir, err := os.Getwd()
if err != nil {
return "", err
}
prevDir := ""
for curDir != prevDir {
if _, err := os.Stat(filepath.Join(curDir, ".git")); err == nil {
return curDir, nil
} else if !os.IsNotExist(err) {
return "", err
}
prevDir = curDir
curDir = filepath.Dir(curDir)
}
return "", fmt.Errorf("not a git repository (or any of the parent directories): .git")
}
func mainInternal() error {
projectRoot, err := findProjectRoot()
if err != nil {
return err
}
envText, err := os.ReadFile(filepath.Join(projectRoot, "env.yaml"))
if err != nil {
return err
}
var env interface{}
if err := yaml.Unmarshal(envText, &env); err != nil {
return err
}
if err := filepath.WalkDir(projectRoot, func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if d.Name() == ".git" {
return fs.SkipDir
}
dir := filepath.Dir(path)
if strings.Contains(d.Name(), ".in.") {
fmt.Fprintf(os.Stderr, "template_secrets.go: processing %s\n", path)
input, err := os.ReadFile(path)
if err != nil {
return err
}
tmpl, err := template.New("").Funcs(sprig.TxtFuncMap()).Option("missingkey=error").Parse(string(input))
if err != nil {
return err
}
var output bytes.Buffer
if err := tmpl.Execute(&output, env); err != nil {
return err
}
if err := os.WriteFile(
filepath.Join(dir, strings.ReplaceAll(d.Name(), ".in.", ".out.")),
output.Bytes(), 0644,
); err != nil {
return err
}
}
return nil
}); err != nil {
return err
}
return nil
}
func main() {
if err := mainInternal(); err != nil {
fmt.Fprintf(os.Stderr, "template.go: %s\n", err.Error())
os.Exit(1)
}
}