diff options
| author | Jeff Carr <[email protected]> | 2025-01-09 03:44:09 -0600 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-01-09 03:44:09 -0600 |
| commit | 6f354d8d9f2d34505794f5f842de967297a78616 (patch) | |
| tree | 8bc10cd5c9966b8ea9550cd3da9a32d50a3c61be /protoParse.go | |
| parent | 4ff3a92bc684dfc2d136b1d2ae620097573056b9 (diff) | |
rename file
Diffstat (limited to 'protoParse.go')
| -rw-r--r-- | protoParse.go | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/protoParse.go b/protoParse.go new file mode 100644 index 0000000..49f382c --- /dev/null +++ b/protoParse.go @@ -0,0 +1,130 @@ +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") + // log.Info("found marshal", newm) + marshalKeys = append(marshalKeys, newm) + } 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" { + // log.Info("Found Unique for:", parts) + newu := parts[1] + newu = cases.Title(language.English, cases.NoLower).String(newu) + log.Info("found unique field", newu, "in struct", curmsg.Name) + // uniqueKeys = append(uniqueKeys, newu) + } 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("Found Mutex for:", msg.Name) + } + if strings.Contains(line, "`autogenpb:marshal`") { + msg.DoMarshal = true + log.Info("Found Marshal for:", 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 +} |
