Files
wild-central-api/internal/tools/gomplate.go
2025-10-11 17:06:14 +00:00

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
}