autogenpb/main.go

105 lines
2.2 KiB
Go
Raw Normal View History

2024-11-29 08:30:19 -06:00
package main
import (
"os"
"strings"
"github.com/alexflint/go-arg"
"go.wit.com/lib/gui/shell"
"go.wit.com/log"
"golang.org/x/text/cases"
"golang.org/x/text/language"
2024-11-29 08:30:19 -06:00
)
// sent via -ldflags
var VERSION string
var BUILDTIME string
var sortmap map[string]string
2024-11-29 08:30:19 -06:00
func main() {
pp := arg.MustParse(&argv)
// you need a proto file
if argv.Proto == "" {
log.Info("you must provide --proto <filename>")
os.Exit(-1)
}
if !shell.Exists(argv.Proto) {
log.Info("protobuf", argv.Proto, "is missing")
if !argv.DryRun {
os.Exit(-1)
}
}
if !strings.HasSuffix(argv.Proto, ".proto") {
log.Info("protobuf", argv.Proto, "must end in .proto")
os.Exit(-1)
}
// you need --upbase and --lobase
if argv.Proto == "" {
pp.WriteHelp(os.Stdout)
os.Exit(-1)
}
cmd := []string{"go", "list", "-f", "'{{.Name}}'"}
result := shell.Run(cmd)
packageName := strings.Join(result.Stdout, "\n")
packageName = strings.TrimSpace(packageName)
packageName = strings.Trim(packageName, "'")
log.Info("packageName == ", packageName)
protobase := strings.TrimSuffix(argv.Proto, ".proto")
sortmap = make(map[string]string)
sortmap["package"] = packageName
sortmap["protobase"] = protobase
if argv.LoBase == "" {
// if not set, assumed to be protobase
sortmap["base"] = protobase
} else {
sortmap["base"] = argv.LoBase
}
sortmap["lock"] = sortmap["base"] + "sMu" // is nonglobal and plural
if argv.UpBase == "" {
sortmap["Base"] = cases.Title(language.English, cases.NoLower).String(protobase)
sortmap["Bases"] = sortmap["Base"] + "s"
} else {
sortmap["Base"] = argv.UpBase
sortmap["Bases"] = sortmap["Base"] + "s"
}
if argv.DryRun {
for k, v := range sortmap {
log.Info(k, "=", v)
}
os.Exit(0)
}
// add mutex
if err := addMutex(sortmap); err == nil {
log.Info("adding mutex to existing protoc-gen-go file worked")
sortmap["mutex"] = "true"
} else {
log.Info("adding mutex to existing protoc-gen-go file did not work")
sortmap["mutex"] = "false"
}
if argv.NoSort {
log.Info("not making sort.pb.go file (--no-sort == true)")
} else {
makeSortfile()
}
if argv.NoMarshal {
log.Info("not making marshal.pb.go file (--no-marshal == true)")
} else {
// make the foo.marshal.pb.go file
marshal(sortmap)
}
}