package main // auto run protoc with the correct args import ( "os" "strings" "go.wit.com/log" "golang.org/x/text/cases" "golang.org/x/text/language" ) // this parses the .proto file and handles anything with `autogenpb: ` // finds autogenpb:marshal and autogenpb:unique in the .proto file // // adds fields to []marshal and []unique func (pb *Files) findAutogenpb(f *File) error { // log.Info("starting findAutogenpb() on", names["protofile"]) // read in the .proto file data, err := os.ReadFile(f.Filename) if err != nil { // log.Info("open config file :", err) return err } // first parse the proto file for message struct names for _, line := range strings.Split(string(data), "\n") { if strings.HasPrefix(line, "message ") { f.parseForMessage(line) } } // look for included proto files lines := strings.Split(string(data), "\n") for _, line := range lines { // log.Info("line:", line) parts := strings.Fields(line) if strings.Contains(line, "autogenpb:marshal") { newm := parts[1] // log.Info("found marshal", newm) marshalKeys = append(marshalKeys, newm) } if strings.Contains(line, "autogenpb:unique") { newu := parts[1] newu = cases.Title(language.English, cases.NoLower).String(newu) // log.Info("found unique field", newu) uniqueKeys = append(uniqueKeys, newu) } } return nil } // looks for mutex and marshal entries func (f *File) parseForMessage(line string) { fields := strings.Fields(line) if fields[0] != "message" { return } msgName := fields[1] msg := new(MsgName) f.MsgNames = append(f.MsgNames, msg) msg.Name = msgName if strings.Contains(line, "`autogenpb:mutex`") { msg.DoMutex = true log.Info("Found Mutex for:", msg.Name) } if strings.Contains(line, "`autogenpb:marshal`") { msg.DoMarshal = true log.Info("Found Marshal for:", msg.Name) } } func (pb *Files) findGlobalAutogenpb(f *File) error { // log.Info("starting findAutogenpb() on", filename) // read in the .proto file data, err := os.ReadFile(f.Filename) if err != nil { // log.Info("open config file :", err) return err } lines := strings.Split(string(data), "\n") for _, line := range lines { if strings.Contains(line, "autogenpb:ignoreproto") { // ignore this protofile completely (don't make foo.pb.go) os.Exit(0) } if strings.Contains(line, "autogenpb:no-marshal") { // don't marshal anything (don't make foo.marshal.pb.go) argv.NoMarshal = true } if strings.Contains(line, "autogenpb:no-sort") { // don't sort anything (don't make foo.sort.pb.go) argv.NoSort = true } if strings.Contains(line, "autogenpb:mutex") { // try the mutex hack argv.Mutex = true } if strings.Contains(line, "autogenpb:gover:") { // todo: parse the output here parts := strings.Split(line, "autogenpb:gover:") log.Info("found gover:", parts[1]) argv.Mutex = true } } return nil }