130 lines
3.2 KiB
Go
130 lines
3.2 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path"
|
|
"strings"
|
|
|
|
"go-common/app/tool/warden/generator"
|
|
"go-common/app/tool/warden/goparser"
|
|
"go-common/app/tool/warden/types"
|
|
)
|
|
|
|
const (
|
|
// GoCommon .
|
|
GoCommon = "go-common"
|
|
)
|
|
|
|
var (
|
|
name string
|
|
dir string
|
|
recvName string
|
|
workDir string
|
|
protoOut string
|
|
csCode string
|
|
goPackage string
|
|
protoPackage string
|
|
ignoreTypeError bool
|
|
noprotoc bool
|
|
importPaths string
|
|
)
|
|
|
|
func init() {
|
|
flag.StringVar(&name, "name", "", "service name")
|
|
flag.StringVar(&dir, "dir", "service", "service go code dir")
|
|
flag.StringVar(&recvName, "recv", "Service", "receiver name")
|
|
flag.StringVar(&workDir, "workdir", ".", "workdir")
|
|
flag.StringVar(&csCode, "cs-code", "server/grpc", "server code directory")
|
|
flag.StringVar(&protoOut, "proto-out", "api/api.proto", "proto file save path")
|
|
flag.StringVar(&goPackage, "go-package", "", "go-package")
|
|
flag.StringVar(&protoPackage, "proto-package", "", "proto-package")
|
|
flag.BoolVar(&ignoreTypeError, "ignore-type-error", true, "ignore type error")
|
|
flag.BoolVar(&noprotoc, "noprotoc", false, "don't run protoc")
|
|
flag.StringVar(&importPaths, "proto-path", defaultImportPath(), "specify the directory in which to search for imports.")
|
|
}
|
|
|
|
func defaultImportPath() string {
|
|
for _, goPath := range strings.Split(os.Getenv("GOPATH"), ":") {
|
|
fixPath := path.Join(goPath, "src", GoCommon)
|
|
if _, err := os.Stat(fixPath); err == nil {
|
|
return fixPath
|
|
}
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func main() {
|
|
var err error
|
|
if !flag.Parsed() {
|
|
flag.Parse()
|
|
}
|
|
if name == "" {
|
|
log.Fatal("service name required")
|
|
}
|
|
var servicePackage string
|
|
servicePackage, err = goparser.GoPackage(dir)
|
|
if err != nil {
|
|
log.Fatalf("auto detect gopackage error %s", err)
|
|
}
|
|
if goPackage == "" {
|
|
// auto set go package
|
|
goPackage = path.Join(path.Dir(servicePackage), csCode)
|
|
}
|
|
if protoPackage == "" {
|
|
log.Fatal("proto package name required")
|
|
}
|
|
var spec *types.ServiceSpec
|
|
spec, err = goparser.Parse(name, dir, recvName, workDir)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
var paths []string
|
|
if importPaths != "" {
|
|
paths = strings.Split(importPaths, ",")
|
|
}
|
|
options := &generator.ServiceProtoOptions{
|
|
GoPackage: goPackage,
|
|
ProtoPackage: protoPackage,
|
|
IgnoreType: ignoreTypeError,
|
|
ImportPaths: paths,
|
|
}
|
|
|
|
protoFile := path.Join(workDir, protoOut)
|
|
if err = os.MkdirAll(path.Dir(protoFile), 0755); err != nil {
|
|
log.Print(err)
|
|
}
|
|
var protoFp *os.File
|
|
protoFp, err = os.OpenFile(protoFile, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer protoFp.Close()
|
|
if err := generator.GenServiceProto(protoFp, spec, options); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
if !noprotoc {
|
|
if err := generator.Protoc(protoFile, "", "", paths); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
csOptions := &generator.GenCSCodeOptions{
|
|
PbPackage: path.Join(path.Dir(servicePackage), path.Dir(protoOut)),
|
|
RecvName: recvName,
|
|
RecvPackage: servicePackage,
|
|
}
|
|
if err := generator.GenCSCode(csCode, spec, csOptions); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Printf(`
|
|
🍺 (゜-゜)つロ 干杯~ !
|
|
proto file: %s
|
|
server: %s
|
|
`, protoFile, path.Join(csCode, "server.go"))
|
|
}
|