-
Notifications
You must be signed in to change notification settings - Fork 6
/
func.go
124 lines (116 loc) · 2.62 KB
/
func.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
112
113
114
115
116
117
118
119
120
121
122
123
124
package commands
import (
"bytes"
"fmt"
"github.com/gobuffalo/packr/v2"
"io/ioutil"
"os"
"os/exec"
"path"
"path/filepath"
"regexp"
"strings"
"text/template"
)
func modPath(p string) string {
dir := filepath.Dir(p)
for {
if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil {
content, _ := ioutil.ReadFile(filepath.Join(dir, "go.mod"))
mod := RegexpReplace(`module\s+(?P<name>[\S]+)`, string(content), "$name")
name := strings.TrimPrefix(filepath.Dir(p), dir)
name = strings.TrimPrefix(name, string(os.PathSeparator))
if name == "" {
return fmt.Sprintf("%s/", mod)
}
return fmt.Sprintf("%s/%s/", mod, name)
}
parent := filepath.Dir(dir)
if dir == parent {
return ""
}
dir = parent
}
}
// RegexpReplace replace regexp
func RegexpReplace(reg, src, temp string) string {
var result []byte
pattern := regexp.MustCompile(reg)
for _, subMatches := range pattern.FindAllStringSubmatchIndex(src, -1) {
result = pattern.ExpandString(result, temp, src, subMatches)
}
return string(result)
}
//go:generate packr2
func create() (err error) {
box := packr.New("all", "./../template/ginana")
if err = os.MkdirAll(f.Path, 0755); err != nil {
return
}
for _, name := range box.List() {
if f.ModPrefix != "" && name == "go.mod.tmpl" {
continue
}
tmpl, _ := box.FindString(name)
i := strings.LastIndex(name, string(os.PathSeparator))
if i > 0 {
dir := name[:i]
if err = os.MkdirAll(filepath.Join(f.Path, dir), 0755); err != nil {
return
}
}
if strings.HasSuffix(name, ".tmpl") {
name = strings.TrimSuffix(name, ".tmpl")
}
if err = write(filepath.Join(f.Path, name), tmpl); err != nil {
return
}
}
if err = generate("./..."); err != nil {
return
}
if err = generate("./internal/wire/wire.go"); err != nil {
return
}
return
}
func generate(path string) error {
cmd := exec.Command("go", "generate", "-x", path)
cmd.Dir = f.Path
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
func write(path, tpl string) (err error) {
data, err := parse(tpl)
if err != nil {
return
}
return ioutil.WriteFile(path, data, 0644)
}
func parse(s string) ([]byte, error) {
t, err := template.New("").Parse(s)
if err != nil {
return nil, err
}
var buf bytes.Buffer
if err = t.Execute(&buf, f); err != nil {
return nil, err
}
return buf.Bytes(), nil
}
func buildDir(base string, cmd string, n int) string {
dirs, err := ioutil.ReadDir(base)
if err != nil {
panic(err)
}
for _, d := range dirs {
if d.IsDir() && d.Name() == cmd {
return path.Join(base, cmd)
}
}
if n <= 1 {
return base
}
return buildDir(filepath.Dir(base), cmd, n-1)
}