You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
3.2 KiB
129 lines
3.2 KiB
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")) |
|
}
|
|
|