/
template.go
111 lines (98 loc) · 2.17 KB
/
template.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package util
import (
"bytes"
"fmt"
"io"
"os"
"path/filepath"
"text/template"
)
// renderToString - Takes a template string and data instance and returns a
// rendered string
func renderToString(templStr string, data interface{}) (string, error) {
t, err := template.New("t").Parse(templStr)
if err != nil {
return "", err
}
var res bytes.Buffer
if execErr := t.Execute(&res, data); execErr != nil {
return "", execErr
}
return res.String(), nil
}
// renderToFile - Takes a template file and data instance to renders to a
// destination file
func renderToFile(
tmpl, dst string,
data interface{},
overwrite bool,
stdin io.Reader,
stdout io.Writer,
) error {
// Use the template file to create a template instance
t, err := template.ParseFiles(tmpl)
if err != nil {
return err
}
stat, err := os.Stat(dst)
if err == nil {
if stat.IsDir() {
return fmt.Errorf("cannot overwrite directory %s", dst)
}
if !overwrite {
confirm, err := Confirm(fmt.Sprintf("Overwrite file %s?", dst), false, stdin, stdout)
if err != nil {
return err
}
if !confirm {
return nil
}
}
}
f, err := CreateFile(dst)
if err != nil {
return err
}
defer f.Close()
// Write the rendered text into the destination file
err = t.Execute(f, data)
if err != nil {
return err
}
return nil
}
// RenderTemplateDir - Render all files in the tmplDir into dst
func RenderTemplateDir(
tmplDir,
dstDir string,
problem *EulerProblem,
overwrite bool,
stdin io.Reader,
stdout io.Writer,
) error {
return filepath.Walk(tmplDir,
func(tmpl string, info os.FileInfo, err error) error {
if err != nil {
return err
}
// Skip directories
if info.IsDir() {
return nil
}
// build the "raw" output path by appending the relative path
// to the output path
relPath, err := filepath.Rel(tmplDir, tmpl)
if err != nil {
return err
}
rawDst := filepath.Join(dstDir, relPath)
// Render any template variables in the output path
// e.g. euler{{.ProblemNum}}.jl -> euler25.jl
dst, err := renderToString(rawDst, problem)
if err != nil {
return err
}
return renderToFile(tmpl, dst, problem, overwrite, stdin, stdout)
},
)
}