From bb8e2290e0dba48b4e18368be5bd02751aa82b19 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Sat, 11 Jan 2025 10:19:37 -0600 Subject: [PATCH] maybe got it finally --- generate.go | 53 ++++++++++++++++++++++++++++----------------- generateIterator.go | 44 ++++++++++++++++++++++++++++++++++--- generateSort.go | 7 ++---- protoParse.go | 4 ++-- 4 files changed, 78 insertions(+), 30 deletions(-) diff --git a/generate.go b/generate.go index dc07fa8..b22b3f7 100644 --- a/generate.go +++ b/generate.go @@ -20,12 +20,14 @@ func (pb *Files) makeNewSortfile(pf *File) error { header(wSort, pf) - pf.Base.iterTop(wSort) - pf.Base.iterNext(wSort) - pf.selectAllFunc(wSort) - pf.iterSelect(wSort) + // pf.Base.iterTop(wSort) + // pf.Base.iterNext(wSort) + // pf.selectAllFunc(wSort) + // pf.iterSelect(wSort) - pf.sortByFunc(wSort, pf.Bases, pf.Base) + // pf.sortByFunc(wSort, pf.Bases, pf.Base) + pf.newGenerateSort(wSort, pf.Bases) + pf.newGenerateSort(wSort, pf.Base) /* pf.appendUnique(wFind) // Append() enforce no unique keys @@ -55,23 +57,34 @@ func (pf *File) newGenerateSort(w io.Writer, parent *MsgName) error { var FRUIT string = parent.Name var LOCK string = parent.Lockname - for _, v := range parent.Vars { - if v.IsRepeated { - var APPLES string = v.VarName - var APPLE string = v.VarType - newIter(w, FRUIT, APPLE, APPLES, LOCK) - msg := pf.findMsg(APPLE) - if msg == nil { - return fmt.Errorf("failed to find struct %s", APPLE) - } - for _, v := range msg.Vars { - if v.HasSort { - var COLOR string = v.VarName - newSortBy(w, FRUIT, APPLE, COLOR) - } + var allLen bool - } + for _, v := range parent.Vars { + if !v.IsRepeated { + continue } + var APPLES string = v.VarName + var APPLE string = v.VarType + if !allLen { + // only can run these once for now + addAllFunc(w, FRUIT, APPLE, LOCK) + addLenFunc(w, FRUIT, APPLES, LOCK) + allLen = true + } + addSelectAll(w, FRUIT, APPLE, APPLES, LOCK) + newIter(w, FRUIT, APPLE, APPLES, LOCK) + msg := pf.findMsg(APPLE) + if msg == nil { + return fmt.Errorf("failed to find struct %s", APPLE) + } + for _, v := range msg.Vars { + if !v.HasSort { + continue + } + var COLOR string = v.VarName + newSortBy(w, FRUIT, APPLE, APPLES, COLOR) + } + } return nil } diff --git a/generateIterator.go b/generateIterator.go index f54bf60..a710212 100644 --- a/generateIterator.go +++ b/generateIterator.go @@ -14,7 +14,7 @@ func newIter(w io.Writer, FRUIT, APPLE, APPLES, LOCK string) { fmt.Fprintln(w, "}") fmt.Fprintln(w, "") fmt.Fprintln(w, "// safely returns a slice of pointers to the FRUIT protobufs") - fmt.Fprintln(w, "func (x *"+FRUIT+") all() []*"+APPLE+" {") + fmt.Fprintln(w, "func (x *"+FRUIT+") all"+APPLES+"() []*"+APPLE+" {") fmt.Fprintln(w, " "+LOCK+".RLock()") fmt.Fprintln(w, " defer "+LOCK+".RUnlock()") fmt.Fprintln(w, "") @@ -55,7 +55,7 @@ func newIter(w io.Writer, FRUIT, APPLE, APPLES, LOCK string) { fmt.Fprintln(w, "") } -func newSortBy(w io.Writer, FRUIT, APPLE, COLOR string) { +func newSortBy(w io.Writer, FRUIT, APPLE, APPLES, COLOR string) { fmt.Fprintln(w, "// START sort by ", COLOR, "(this is all you need once the Iterator is defined)") fmt.Fprintln(w, "type "+APPLE+COLOR+" []*"+APPLE+"") fmt.Fprintln(w, "") @@ -64,7 +64,7 @@ func newSortBy(w io.Writer, FRUIT, APPLE, COLOR string) { fmt.Fprintln(w, "func (a "+APPLE+COLOR+") Swap(i, j int) { a[i], a[j] = a[j], a[i] }") fmt.Fprintln(w, "") fmt.Fprintln(w, "func (x *"+FRUIT+") SortBy"+COLOR+"() *"+APPLE+"Iterator {") - fmt.Fprintln(w, " things := x.all()") + fmt.Fprintln(w, " things := x.all"+APPLES+"()") fmt.Fprintln(w, "") fmt.Fprintln(w, " sort.Sort("+APPLE+COLOR+"(things))") fmt.Fprintln(w, "") @@ -73,3 +73,41 @@ func newSortBy(w io.Writer, FRUIT, APPLE, COLOR string) { fmt.Fprintln(w, "}") fmt.Fprintln(w, "// END sort by", COLOR) } + +func addAllFunc(w io.Writer, FRUIT, APPLE, LOCK string) { + fmt.Fprintln(w, "func (x *"+FRUIT+") All() *"+APPLE+"Iterator {") + fmt.Fprintln(w, " "+APPLE+"Pointers := x.selectAll"+APPLE+"()") + fmt.Fprintln(w, "") + fmt.Fprintln(w, " iterator := New"+APPLE+"Iterator("+APPLE+"Pointers)") + fmt.Fprintln(w, " return iterator") + fmt.Fprintln(w, "}") + fmt.Fprintln(w, "") +} + +func addLenFunc(w io.Writer, FRUIT, APPLES, LOCK string) { + fmt.Fprintln(w, "") + fmt.Fprintln(w, "func (x *"+FRUIT+") Len() int {") + fmt.Fprintln(w, " "+LOCK+".RLock()") + fmt.Fprintln(w, " defer "+LOCK+".RUnlock()") + fmt.Fprintln(w, "") + fmt.Fprintln(w, " return len(x."+APPLES+")") + fmt.Fprintln(w, "}") + fmt.Fprintln(w, "") +} + +func addSelectAll(w io.Writer, FRUIT, APPLE, APPLES, LOCK string) { + fmt.Fprintln(w, "// safely returns a slice of pointers to the "+APPLE+" protobufs") + fmt.Fprintln(w, "func (x *"+FRUIT+") selectAll"+APPLE+"() []*"+APPLE+" {") + fmt.Fprintln(w, " "+LOCK+".RLock()") + fmt.Fprintln(w, " defer "+LOCK+".RUnlock()") + fmt.Fprintln(w, "") + fmt.Fprintln(w, " // Create a new slice to hold pointers to each "+APPLE+"") + fmt.Fprintln(w, " var tmp []*"+APPLE+"") + fmt.Fprintln(w, " tmp = make([]*"+APPLE+", len(x."+APPLES+"))") + fmt.Fprintln(w, " for i, p := range x."+APPLES+" {") + fmt.Fprintln(w, " tmp[i] = p // Copy pointers for safe iteration") + fmt.Fprintln(w, " }") + fmt.Fprintln(w, "") + fmt.Fprintln(w, " return tmp") + fmt.Fprintln(w, "}") +} diff --git a/generateSort.go b/generateSort.go index 0bb77a6..29eff4a 100644 --- a/generateSort.go +++ b/generateSort.go @@ -1,10 +1,6 @@ package main -import ( - "fmt" - "io" -) - +/* func (msg *MsgName) iterTop(w io.Writer) { var BASE string = msg.Name @@ -117,3 +113,4 @@ func (pf *File) iterSelect(w io.Writer) { fmt.Fprintln(w, " return tmp") fmt.Fprintln(w, "}") } +*/ diff --git a/protoParse.go b/protoParse.go index 173dd6f..8031785 100644 --- a/protoParse.go +++ b/protoParse.go @@ -135,11 +135,11 @@ func parseMsgVar(line string) *MsgVar { if parts[0] == "repeated" { v.IsRepeated = true v.VarType = parts[1] - v.VarName = parts[2] + v.VarName = cases.Title(language.English, cases.NoLower).String(parts[2]) return v } v.VarType = parts[0] - v.VarName = parts[1] + v.VarName = cases.Title(language.English, cases.NoLower).String(parts[1]) return v }