/
gofigure.go
76 lines (67 loc) · 1.68 KB
/
gofigure.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package main
import (
"mustache"
"flag"
"fmt"
"io/ioutil"
"os"
"strings"
)
const ERROR = 2
// main operation modes
var write = flag.Bool("w", false, "write result to (source) file instead of stdout")
var input_file = flag.String("i", "", "specifies the source file instead of stdin")
type Dictionary map[string]string
func (d *Dictionary) define(rule string) {
f := strings.Split(rule, "->", 0)
if len(f) != 2 {
fmt.Fprintf(os.Stderr, "%v\n", f)
fmt.Fprintf(os.Stderr, "template rule must be of the form 'pattern -> replacement'\n")
os.Exit(ERROR)
}
(*d)[strings.TrimSpace(f[0])] = strings.TrimSpace(f[1])
}
func usage() {
fmt.Fprintf(os.Stderr, "usage: gofigure [flags] [pattern -> replacement]\n")
flag.PrintDefaults()
os.Exit(ERROR)
}
func main() {
var rendered_content string
var template []uint8
var error os.Error
var inode *os.Dir
flag.Usage = usage
flag.Parse()
if flag.NArg() == 0 {
fmt.Fprintf(os.Stderr, "no template rules defined\n")
os.Exit(ERROR)
}
rules := make(Dictionary)
for i := 0; i < flag.NArg(); i++ {
rules.define(flag.Args()[i])
}
if *input_file == "" {
if template, error = ioutil.ReadAll(os.Stdin); error == nil {
rendered_content, error = mustache.Render(string(template), rules)
}
} else {
switch inode, error = os.Stat(*input_file); {
case error != nil:
case inode.IsRegular():
rendered_content, error = mustache.RenderFile(*input_file, rules)
default:
}
}
if error != nil {
os.Exit(ERROR)
} else {
if *write {
error = ioutil.WriteFile(*input_file, []byte(rendered_content), 0)
} else {
_, error = os.Stdout.Write([]byte(rendered_content))
}
if error != nil { os.Exit(ERROR) }
}
os.Exit(0)
}