diff --git a/main.go b/main.go index 56b8d7d..babc45f 100644 --- a/main.go +++ b/main.go @@ -2,10 +2,6 @@ package main import ( "fmt" - "os" - "os/exec" - "strings" - "text/template" ) var tmpl = ` @@ -18,39 +14,11 @@ params: default: "ledger.j" --- Hello this is the text: -{{ sh "hledger bal assets" }} +Start from {{ .from }} +{{ sh "hledger bal assets -b $from" }} ` -func sh(command string) string { - args := strings.Split(command, " ") - out, err := exec.Command(args[0], args[1:]...).Output() - if err != nil { - return fmt.Sprintf("> Failed to execute the command:\n> %s\n", err.Error()) - } - return fmt.Sprintf("\n```\n%s\n```\n", string(out)) -} - -func parseDocument(doc string) (frontmatter string, body string, err error) { - doc = strings.TrimLeft(doc, " \n") - sep := "---\n" - if !strings.HasPrefix(doc, sep) { - err = fmt.Errorf("Invalid document: frontmatter required.\n%s", doc) - return - } - parts := strings.Split(doc, sep) - if len(parts) < 3 { - err = fmt.Errorf("Invalid document: frontmatter required.\n%s", doc) - return - } - frontmatter = parts[1] - body = parts[2] - return -} - func main() { - funcMap := template.FuncMap{ - "sh": sh, - } frontmatter, body, err := parseDocument(tmpl) if err != nil { panic(err) @@ -60,9 +28,7 @@ func main() { panic(err) } fmt.Printf("'%s'", templateMeta) - t, err := template.New("foo").Funcs(funcMap).Parse(body) - if err != nil { - panic(err) - } - t.Execute(os.Stdout, "hledger is awesome") + render(body, map[string]string{ + "from": "2025-07-15", + }) } diff --git a/parse.go b/parse.go index 8796aa3..eeedd36 100644 --- a/parse.go +++ b/parse.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "strings" "gopkg.in/yaml.v3" ) @@ -14,3 +15,20 @@ func parseFrontmatter(input string) (meta TemplateMeta, err error) { } return } + +func parseDocument(doc string) (frontmatter string, body string, err error) { + doc = strings.TrimLeft(doc, " \n") + sep := "---\n" + if !strings.HasPrefix(doc, sep) { + err = fmt.Errorf("Invalid document: frontmatter required.\n%s", doc) + return + } + parts := strings.Split(doc, sep) + if len(parts) < 3 { + err = fmt.Errorf("Invalid document: frontmatter required.\n%s", doc) + return + } + frontmatter = parts[1] + body = parts[2] + return +} diff --git a/render.go b/render.go new file mode 100644 index 0000000..644d124 --- /dev/null +++ b/render.go @@ -0,0 +1,34 @@ +package main + +import ( + "fmt" + "os" + "os/exec" + "text/template" +) + +func sh(ctx TemplateContext) func(string) string { + return func(command string) string { + cmd := exec.Command("sh", "-c", command) + for k, v := range ctx { + cmd.Env = append(cmd.Env, k+"="+v) + } + fmt.Println(cmd.Environ()) + out, err := cmd.Output() + if err != nil { + return fmt.Sprintf("> Failed to execute the command: %s\n> %s\n", cmd.Args, err.Error()) + } + return fmt.Sprintf("\n```\n%s\n```\n", string(out)) + } +} + +func render(tmpl string, ctx TemplateContext) { + funcMap := template.FuncMap{ + "sh": sh(ctx), + } + t, err := template.New("foo").Funcs(funcMap).Parse(tmpl) + if err != nil { + panic(err) + } + t.Execute(os.Stdout, ctx) +} diff --git a/types.go b/types.go index e65c8ed..9a2ebeb 100644 --- a/types.go +++ b/types.go @@ -19,3 +19,5 @@ type ParamSpec struct { Required bool `yaml:"required"` Default string `yaml:"default"` } + +type TemplateContext map[string]string