/
util.go
84 lines (74 loc) · 1.82 KB
/
util.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
// Package utils provides file path dependent methods
package utils
import (
"bytes"
goformat "go/format"
"os"
"path"
"text/template"
)
// 文件模板配置结构体
type fileTemplateConfig struct {
dir string // 目录
subdir string // 子目录
filename string // 文件名
templateName string // 模板名称
category string // 文件类型
templateFile string // 模板文件
builtinTemplate string // 内置模板
data interface{} // 填充内容
}
// 可能创建文件,如果有创建文件,返回文件句柄
func MaybeCreateFile(dir, subDir, file string) (*os.File, bool, error) {
err := MkdirIfNotExist(path.Join(dir, subDir))
if err != nil {
return nil, false, err
}
fPath := path.Join(dir, subDir, file)
if FileExists(fPath) {
// TODO:打印日志
return nil, false, nil
}
fp, err := CreateIfNotExist(fPath)
if err != nil {
return fp, false, err
}
return fp, true, err
}
// 代码格式化
func formatCode(code string) string {
ret, err := goformat.Source([]byte(code))
if err != nil {
return code
}
return string(ret)
}
// 生成目标文件
func genTargetFile(c fileTemplateConfig) error {
fp, created, err := MaybeCreateFile(c.dir, c.subdir, c.filename)
if err != nil {
return err
}
if !created {
return nil
}
defer fp.Close()
var text string
if len(c.category) == 0 || len(c.templateFile) == 0 {
text = c.builtinTemplate
} else {
text, err = LoadTemplate(c.category, c.templateFile, c.builtinTemplate)
if err != nil {
return err
}
}
t := template.Must(template.New(c.templateName).Parse(text))
buffer := new(bytes.Buffer)
err = t.Execute(buffer, c.data)
if err != nil {
return err
}
code := formatCode(buffer.String())
_, err = fp.WriteString(code)
return err
}