/
new_service.go
92 lines (81 loc) · 2.45 KB
/
new_service.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
package generator
import (
"bytes"
"fmt"
"os/exec"
"path"
"strings"
"github.com/dave/jennifer/jen"
"github.com/gps-gaming/kit/fs"
"github.com/gps-gaming/kit/utils"
"github.com/spf13/viper"
)
// NewService implements Gen and is used to create a new service.
type NewService struct {
BaseGenerator
name string
interfaceName string
destPath string
filePath string
}
// NewNewService returns a initialized and ready generator.
//
// The name parameter is the name of the service that will be created
// this name should be without the `Service` suffix
func NewNewService(name string) Gen {
gs := &NewService{
name: name,
interfaceName: utils.ToCamelCase(name + "Service"),
destPath: fmt.Sprintf(viper.GetString("gk_service_path_format"), utils.ToLowerSnakeCase(name)),
}
gs.filePath = path.Join(gs.destPath, viper.GetString("gk_service_file_name"))
gs.srcFile = jen.NewFilePath(strings.Replace(gs.destPath, "\\", "/", -1))
gs.InitPg()
gs.fs = fs.Get()
return gs
}
// Generate will run the generator.
func (g *NewService) Generate() error {
g.CreateFolderStructure(g.destPath)
err := g.genModule()
if err != nil {
println(err.Error())
return err
}
comments := []string{
"Add your methods here",
"e.x: Foo(ctx context.Context,s string)(rs string, err error)",
}
partial := NewPartialGenerator(nil)
partial.appendMultilineComment(comments)
g.code.Raw().Commentf("%s describes the service.", g.interfaceName).Line()
g.code.appendInterface(
g.interfaceName,
[]jen.Code{partial.Raw()},
)
return g.fs.WriteFile(g.filePath, g.srcFile.GoString(), false)
}
func (g *NewService) genModule() error {
prjName := utils.ToLowerSnakeCase(g.name)
exist, _ := g.fs.Exists(prjName + "/go.mod")
if exist {
return nil
}
moduleName := prjName
if viper.GetString("n_s_module") != "" {
moduleName = viper.GetString("n_s_module")
moduleNameSlice := strings.Split(moduleName, "/")
moduleNameSlice[len(moduleNameSlice)-1] = utils.ToLowerSnakeCase(moduleNameSlice[len(moduleNameSlice)-1])
moduleName = strings.Join(moduleNameSlice, "/")
}
cmdStr := "cd " + prjName + " && go mod init " + moduleName
cmd := exec.Command("sh", "-c", cmdStr)
var stderr bytes.Buffer
cmd.Stderr = &stderr
_, err := cmd.Output()
// return cmd.Stderr to debug (err here provides nothing useful, only `exit status 1`)
if err != nil {
return fmt.Errorf("genModule: sh -c %s => err:%v", cmdStr, err.Error()+" , "+stderr.String())
}
return nil
}