74 lines
2.0 KiB
Go
74 lines
2.0 KiB
Go
package tools
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
// YQ provides a wrapper around the yq command-line tool
|
|
type YQ struct {
|
|
yqPath string
|
|
}
|
|
|
|
// NewYQ creates a new YQ wrapper
|
|
func NewYQ() *YQ {
|
|
path, err := exec.LookPath("yq")
|
|
if err != nil {
|
|
path = "yq"
|
|
}
|
|
return &YQ{yqPath: path}
|
|
}
|
|
|
|
// Get retrieves a value from a YAML file using a yq expression
|
|
func (y *YQ) Get(filePath, expression string) (string, error) {
|
|
cmd := exec.Command(y.yqPath, expression, filePath)
|
|
var stdout, stderr bytes.Buffer
|
|
cmd.Stdout = &stdout
|
|
cmd.Stderr = &stderr
|
|
if err := cmd.Run(); err != nil {
|
|
return "", fmt.Errorf("yq get failed: %w, stderr: %s", err, stderr.String())
|
|
}
|
|
return strings.TrimSpace(stdout.String()), nil
|
|
}
|
|
|
|
// Set sets a value in a YAML file using a yq expression
|
|
func (y *YQ) Set(filePath, expression, value string) error {
|
|
if !strings.HasPrefix(expression, ".") {
|
|
expression = "." + expression
|
|
}
|
|
quotedValue := fmt.Sprintf(`"%s"`, strings.ReplaceAll(value, `"`, `\"`))
|
|
setExpr := fmt.Sprintf("%s = %s", expression, quotedValue)
|
|
cmd := exec.Command(y.yqPath, "-i", setExpr, filePath)
|
|
var stderr bytes.Buffer
|
|
cmd.Stderr = &stderr
|
|
if err := cmd.Run(); err != nil {
|
|
return fmt.Errorf("yq set failed: %w, stderr: %s", err, stderr.String())
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Delete removes a key from a YAML file
|
|
func (y *YQ) Delete(filePath, expression string) error {
|
|
delExpr := fmt.Sprintf("del(%s)", expression)
|
|
cmd := exec.Command(y.yqPath, "-i", delExpr, filePath)
|
|
var stderr bytes.Buffer
|
|
cmd.Stderr = &stderr
|
|
if err := cmd.Run(); err != nil {
|
|
return fmt.Errorf("yq delete failed: %w, stderr: %s", err, stderr.String())
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Validate checks if a YAML file is valid
|
|
func (y *YQ) Validate(filePath string) error {
|
|
cmd := exec.Command(y.yqPath, "eval", ".", filePath)
|
|
var stderr bytes.Buffer
|
|
cmd.Stderr = &stderr
|
|
if err := cmd.Run(); err != nil {
|
|
return fmt.Errorf("yaml validation failed: %w, stderr: %s", err, stderr.String())
|
|
}
|
|
return nil
|
|
}
|