123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- 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"))
- }
|