add InsertBy() functions

This commit is contained in:
Jeff Carr 2025-03-09 09:30:17 -05:00
parent 7f03282aca
commit 4f881d17c0
3 changed files with 68 additions and 37 deletions

View File

@ -240,7 +240,7 @@ func (pb *Files) makeNewSortfile(pf *File) error {
// find()
for _, v := range msg.Vars {
if v.VarType != "string" {
if !(v.VarType == "string" || (v.VarType == "int64")) {
continue
}
if v.IsRepeated {
@ -254,13 +254,15 @@ func (pb *Files) makeNewSortfile(pf *File) error {
// special case because of the enforced .proto format
FUNCNAME = "FindBy" + v.VarName
funcdef := pmsg.generateFindBy(wSort, FUNCNAME, PARENT, s, v)
// func (msg *MsgName) generateFindBy(w io.Writer, FUNCNAME, STRUCT, VARNAME, VARTYPE, COLOR string) string {
log.Printf("Adding %s\n", funcdef)
} else {
// deprecate these
FUNCNAME = "Find" + VARNAME + "By" + v.VarName
}
FRUITS := PARENT
FRUIT := s.VarType
APPLE := v.VarName
COLOR := v.VarType
funcdef = pmsg.insertBy(wSort, FRUITS, FRUIT, APPLE, COLOR)
log.Printf("Adding %s\n", funcdef)
}
} else {
if v.VarType == "string" {
// probably dumb. move to a database if you need this

View File

@ -12,31 +12,55 @@ import (
func (msg *MsgName) generateFindBy(w io.Writer, FUNCNAME, STRUCT string, sortvals *Sort, childVar *MsgVar) string {
LOCK := msg.getLockname("x")
if childVar.VarType != "string" {
return ""
}
VARNAME := sortvals.VarName
VARTYPE := sortvals.VarType
COLOR := childVar.VarName
funcdef := "func (x *" + STRUCT + ") " + FUNCNAME + "(s string) *" + VARTYPE
fmt.Fprintln(w, "// lookup a", STRUCT, "by the ", COLOR)
fmt.Fprintln(w, funcdef, "{")
fmt.Fprintln(w, " if x == nil {")
fmt.Fprintln(w, " return nil")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " "+LOCK+".RLock()")
fmt.Fprintln(w, " defer "+LOCK+".RUnlock()")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " for i, _ := range x."+VARNAME+" {")
fmt.Fprintln(w, " if x."+VARNAME+"[i]."+COLOR+" == s {")
fmt.Fprintln(w, " return x."+VARNAME+"[i]")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, " return nil")
fmt.Fprintln(w, "}")
fmt.Fprintln(w, "")
if childVar.VarType == "string" {
funcdef := "func (x *" + STRUCT + ") " + FUNCNAME + "(s string) *" + VARTYPE
return funcdef
fmt.Fprintln(w, "// lookup a", STRUCT, "by the ", COLOR)
fmt.Fprintln(w, funcdef, "{")
fmt.Fprintln(w, " if x == nil {")
fmt.Fprintln(w, " return nil")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " "+LOCK+".RLock()")
fmt.Fprintln(w, " defer "+LOCK+".RUnlock()")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " for i, _ := range x."+VARNAME+" {")
fmt.Fprintln(w, " if x."+VARNAME+"[i]."+COLOR+" == s {")
fmt.Fprintln(w, " return x."+VARNAME+"[i]")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, " return nil")
fmt.Fprintln(w, "}")
fmt.Fprintln(w, "")
return funcdef
}
if childVar.VarType == "int64" {
funcdef := "func (x *" + STRUCT + ") " + FUNCNAME + "(y int64) *" + VARTYPE
fmt.Fprintln(w, "// lookup a", STRUCT, "by the ", COLOR)
fmt.Fprintln(w, funcdef, "{")
fmt.Fprintln(w, " if x == nil {")
fmt.Fprintln(w, " return nil")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " "+LOCK+".RLock()")
fmt.Fprintln(w, " defer "+LOCK+".RUnlock()")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " for i, _ := range x."+VARNAME+" {")
fmt.Fprintln(w, " if x."+VARNAME+"[i]."+COLOR+" == y {")
fmt.Fprintln(w, " return x."+VARNAME+"[i]")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, " return nil")
fmt.Fprintln(w, "}")
fmt.Fprintln(w, "")
return funcdef
}
return ""
}

View File

@ -9,24 +9,29 @@ import (
)
// new idea. useful? TODO: look at this again in 1y
func (msg *MsgName) insertBy(w io.Writer, FRUIT, APPLES, APPLE string, COLOR string) {
// Mar 2025. yes. this is useful
func (msg *MsgName) insertBy(w io.Writer, FRUITS, FRUIT, APPLE string, COLOR string) string {
LOCK := msg.getLockname("x")
fmt.Fprintln(w, "// returns an "+APPLE+" if "+COLOR+" matches, otherwise create")
fmt.Fprintln(w, "func (x *"+FRUIT+") InsertBy"+COLOR+" (y string) *"+APPLE+" {")
funcdef := "func (x *" + FRUITS + ") InsertBy" + APPLE + " (y " + COLOR + ") *" + FRUIT + " {"
fmt.Fprintln(w, "// returns a "+FRUIT+" if "+APPLE+" matches, otherwise create")
fmt.Fprintln(w, funcdef)
fmt.Fprintln(w, " "+LOCK+".Lock()")
fmt.Fprintln(w, " defer "+LOCK+".Unlock()")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " for _, p := range x."+APPLES+" {")
fmt.Fprintln(w, " if p."+COLOR+" == y {")
fmt.Fprintln(w, " return p")
fmt.Fprintln(w, " for _, z := range x."+FRUITS+" {")
fmt.Fprintln(w, " if z."+APPLE+" == y {")
fmt.Fprintln(w, " return z")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, " }")
fmt.Fprintln(w, "")
fmt.Fprintln(w, " z := new("+APPLE+")")
fmt.Fprintln(w, " z."+COLOR+" = y")
fmt.Fprintln(w, " x."+APPLES+" = append(x."+APPLES+", z)")
fmt.Fprintln(w, " z := new("+FRUIT+")")
fmt.Fprintln(w, " z."+APPLE+" = y")
fmt.Fprintln(w, " x."+FRUITS+" = append(x."+FRUITS+", z)")
fmt.Fprintln(w, " return z")
fmt.Fprintln(w, "}")
fmt.Fprintln(w, "")
return funcdef
}