package runner import ( "context" "fmt" "os/exec" ) type Runner interface { Run(context.Context, string, ...any) ([]byte, error) } type ZRunner struct { Prog string Args []string } func (runner *ZRunner) Run(ctx context.Context, command string, formatArgs ...any) ([]byte, error) { var subArgs string if len(formatArgs) > 0 { subArgs = fmt.Sprintf(command, formatArgs...) } else { subArgs = command } args := append(runner.Args, subArgs) cmd := exec.Command(runner.Prog, args...) return cmd.CombinedOutput() }