...
1
16
17 package main
18
19 import (
20 "bytes"
21 "fmt"
22 "io"
23 "os"
24 "strings"
25 "text/template"
26 )
27
28
29
30
31
32
33
34
35
36
37
38 func main() {
39 kvs := make(map[string]string)
40
41 for _, keyValue := range os.Args[1:] {
42 index := strings.Index(keyValue, "=")
43 if index <= 0 {
44 fmt.Fprintf(os.Stderr, "optional arguments must be of the form <key>=<value>, got instead: %q\n", keyValue)
45 os.Exit(1)
46 }
47 kvs[keyValue[0:index]] = keyValue[index+1:]
48 }
49
50 if err := generate(os.Stdin, os.Stdout, kvs); err != nil {
51 fmt.Fprintf(os.Stderr, "Error: %v\n", err)
52 os.Exit(1)
53 }
54 }
55
56 func generate(in io.Reader, out io.Writer, data interface{}) error {
57 var buf bytes.Buffer
58 if _, err := buf.ReadFrom(in); err != nil {
59 return fmt.Errorf("reading input: %v", err)
60 }
61
62 funcMap := template.FuncMap{
63 "include": include,
64 "indent": indent,
65 "trim": trim,
66 }
67
68 tmpl, err := template.New("").Funcs(funcMap).Parse(buf.String())
69 if err != nil {
70 return fmt.Errorf("parsing input as text template: %v", err)
71 }
72
73 if err := tmpl.Execute(out, data); err != nil {
74 return fmt.Errorf("generating result: %v", err)
75 }
76 return nil
77 }
78
79 func include(filename string) (string, error) {
80 content, err := os.ReadFile(filename)
81 if err != nil {
82 return "", err
83 }
84 return string(content), nil
85 }
86
87 func indent(numSpaces int, content string) string {
88 if content == "" {
89 return ""
90 }
91 prefix := strings.Repeat(" ", numSpaces)
92 return strings.ReplaceAll(content, "\n", "\n"+prefix)
93 }
94
95 func trim(content string) string {
96 return strings.TrimSpace(content)
97 }
98
View as plain text