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 } var curmsg *MsgName // parse the proto file for message struct names for _, line := range strings.Split(string(data), "\n") { if strings.HasPrefix(line, "message ") { curmsg = f.parseForMessage(line) } if strings.HasPrefix(line, "}") { curmsg = nil } // log.Info("line:", line) parts := strings.Fields(line) if strings.Contains(line, "autogenpb:sort") { if parts[0] == "repeated" { newm := parts[1] if curmsg == nil { log.Info("Error: Found Sort for:", newm, "however, this struct can't be used") } else { log.Info("Found Sort for:", newm, "in struct", curmsg.Name) } } else { log.Info("Error:", line) log.Info("Error: can not sort on non repeated fields") } } if strings.Contains(line, "autogenpb:unique") { if parts[0] == "repeated" { newu := parts[1] newu = cases.Title(language.English, cases.NoLower).String(newu) log.Info("Found unique field", newu, "in struct", curmsg.Name) } else { log.Info("Error:", line) log.Info("Error: can not append on non repeated fields") } } } return nil } // looks for mutex and marshal entries func (f *File) parseForMessage(line string) *MsgName { fields := strings.Fields(line) if fields[0] != "message" { return nil } 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("Added Mutex=true:", msg.Name) } if strings.Contains(line, "`autogenpb:marshal`") { msg.DoMarshal = true log.Info("Added Marshal=true:", msg.Name) } return msg } 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 }