summaryrefslogtreecommitdiff
path: root/protoParse.go
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-01-09 03:44:09 -0600
committerJeff Carr <[email protected]>2025-01-09 03:44:09 -0600
commit6f354d8d9f2d34505794f5f842de967297a78616 (patch)
tree8bc10cd5c9966b8ea9550cd3da9a32d50a3c61be /protoParse.go
parent4ff3a92bc684dfc2d136b1d2ae620097573056b9 (diff)
rename file
Diffstat (limited to 'protoParse.go')
-rw-r--r--protoParse.go130
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
+}