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 } // 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) } if strings.Contains(line, "autogenpb:mutex") { parts := strings.Split(line, "autogenpb:mutex") // log.Info("FOUND MUTEX line:", parts[0]) fields := strings.Fields(parts[0]) if fields[0] == "message" { log.Info("FOUND MUTEX:", fields[1]) } } } return nil } 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 }