package main import ( "bytes" "fmt" "os/exec" "strings" ) func (ctx TemplateContext) run(command string) (string, error) { cmd := exec.Command("sh", "-c", command) var stdout bytes.Buffer cmd.Stdout = &stdout cmd.Stderr = &stdout for k, v := range ctx { cmd.Env = append(cmd.Env, k+"="+v) } err := cmd.Run() if err != nil { return "", fmt.Errorf("Failed to execute the command:\nCommand: `%s`\nError: %s\n", command, stdout.String()) } return stdout.String(), nil } func (ctx TemplateContext) raw(command string) (string, error) { out, err := ctx.run(command) if err != nil { return "", err } return strings.TrimSpace(out), nil } func (ctx TemplateContext) codeBlock(command string) (string, error) { out, err := ctx.run(command) if err != nil { return "", err } return fmt.Sprintf("\n```\n%s\n```\n", out), nil } func (ctx TemplateContext) inline(command string) (string, error) { out, err := ctx.run(command) if err != nil { return "", err } return fmt.Sprintf("`%s`", strings.Trim(out, "\n ")), nil }