112 lines
2.7 KiB
Go
112 lines
2.7 KiB
Go
package tools
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
// Gomplate provides a wrapper around the gomplate command-line tool
|
|
type Gomplate struct {
|
|
gomplatePath string
|
|
}
|
|
|
|
// NewGomplate creates a new Gomplate wrapper
|
|
func NewGomplate() *Gomplate {
|
|
// Find gomplate in PATH
|
|
path, err := exec.LookPath("gomplate")
|
|
if err != nil {
|
|
// Default to "gomplate" and let exec handle the error
|
|
path = "gomplate"
|
|
}
|
|
return &Gomplate{gomplatePath: path}
|
|
}
|
|
|
|
// Render renders a template file with the given data sources
|
|
func (g *Gomplate) Render(templatePath, outputPath string, dataSources map[string]string) error {
|
|
args := []string{
|
|
"-f", templatePath,
|
|
"-o", outputPath,
|
|
}
|
|
|
|
// Add data sources
|
|
for name, path := range dataSources {
|
|
args = append(args, "-d", fmt.Sprintf("%s=%s", name, path))
|
|
}
|
|
|
|
cmd := exec.Command(g.gomplatePath, args...)
|
|
|
|
var stderr bytes.Buffer
|
|
cmd.Stderr = &stderr
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
return fmt.Errorf("gomplate render failed: %w, stderr: %s", err, stderr.String())
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// RenderString renders a template string with the given data sources
|
|
func (g *Gomplate) RenderString(template string, dataSources map[string]string) (string, error) {
|
|
args := []string{
|
|
"-i", template,
|
|
}
|
|
|
|
// Add data sources
|
|
for name, path := range dataSources {
|
|
args = append(args, "-d", fmt.Sprintf("%s=%s", name, path))
|
|
}
|
|
|
|
cmd := exec.Command(g.gomplatePath, args...)
|
|
|
|
var stdout, stderr bytes.Buffer
|
|
cmd.Stdout = &stdout
|
|
cmd.Stderr = &stderr
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
return "", fmt.Errorf("gomplate render string failed: %w, stderr: %s", err, stderr.String())
|
|
}
|
|
|
|
return strings.TrimSpace(stdout.String()), nil
|
|
}
|
|
|
|
// RenderWithContext renders a template with context values passed as arguments
|
|
func (g *Gomplate) RenderWithContext(templatePath, outputPath string, context map[string]string) error {
|
|
args := []string{
|
|
"-f", templatePath,
|
|
"-o", outputPath,
|
|
}
|
|
|
|
// Add context values
|
|
for key, value := range context {
|
|
args = append(args, "-c", fmt.Sprintf("%s=%s", key, value))
|
|
}
|
|
|
|
cmd := exec.Command(g.gomplatePath, args...)
|
|
|
|
var stderr bytes.Buffer
|
|
cmd.Stderr = &stderr
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
return fmt.Errorf("gomplate render with context failed: %w, stderr: %s", err, stderr.String())
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Exec executes gomplate with arbitrary arguments
|
|
func (g *Gomplate) Exec(args ...string) (string, error) {
|
|
cmd := exec.Command(g.gomplatePath, args...)
|
|
|
|
var stdout, stderr bytes.Buffer
|
|
cmd.Stdout = &stdout
|
|
cmd.Stderr = &stderr
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
return "", fmt.Errorf("gomplate exec failed: %w, stderr: %s", err, stderr.String())
|
|
}
|
|
|
|
return strings.TrimSpace(stdout.String()), nil
|
|
}
|