diff options
Diffstat (limited to 'generate.go')
| -rw-r--r-- | generate.go | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/generate.go b/generate.go new file mode 100644 index 0000000..43a86d4 --- /dev/null +++ b/generate.go @@ -0,0 +1,178 @@ +package main + +import ( + "fmt" + "io" + "os" + + "go.wit.com/log" + "golang.org/x/text/cases" + "golang.org/x/text/language" +) + +// this file is named poorly. It has more than Sort() + +func (pb *Files) makeNewSortfile(pf *File) error { + wSort, _ := os.OpenFile(pf.Filebase+".sort.pb.go", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + defer wSort.Close() + wFind, _ := os.OpenFile(pf.Filebase+".find.pb.go", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + defer wFind.Close() + + header(wSort, pf) + + pf.Base.iterTop(wSort) + pf.Base.iterNext(wSort) + pf.selectAllFunc(wSort) + pf.iterSelect(wSort) + + pf.sortByFunc(wSort) + + /* + pf.appendUnique(wFind) // Append() enforce no unique keys + if argv.Delete { + pf.deleteWithCopyFunc(wFind) + } else { + pf.deleteFunc(wFind) + } + pf.findFunc(wFind) + */ + + header(wFind, pf) + pf.syncLock(wFind) + pf.specialBases(wFind) + + // attempt to add sort functions for pf.Base + if err := pf.processMessage(pf.Bases, wSort, wFind); err != nil { + return err + } + if err := pf.processMessage(pf.Base, wSort, wFind); err != nil { + return err + } + return nil +} + +func (pf *File) specialBases(wFind io.Writer) { + var FRUIT string = cases.Title(language.English, cases.NoLower).String(pf.Bases.Name) + var APPLES string = cases.Title(language.English, cases.NoLower).String(pf.Bases.Name) + var APPLE string = cases.Title(language.English, cases.NoLower).String(pf.Base.Name) + + pf.Bases.simpleAppend(wFind, FRUIT, APPLES, APPLE) + +} + +// to simplify being able to read the code, FRUIT, APPLES and APPLE are used +// FRUIT == the string name of the message in the protobuf file +// APPLE == the type of the repeated variable +// APPLES == the variable name of the repeated struct +func (pf *File) processMessage(msg *MsgName, wSort, wFind io.Writer) error { + var FRUIT string = cases.Title(language.English, cases.NoLower).String(msg.Name) + + log.Printf("Generating functions for %s\n", FRUIT) + + for _, v := range msg.Vars { + if !v.IsRepeated { + log.Printf("\tSKIP %s %s\n", v.VarName, v.VarType) + continue + } + log.Printf("\tFOUND REPEATED %s %s\n", v.VarName, v.VarType) + // use easier to read variable names APPLE and APPLES in the code + var APPLE string = v.VarType + var APPLES string = cases.Title(language.English, cases.NoLower).String(v.VarName) + + // try and find the message struct for APPLE + var found *MsgName + if pf.Base.Name == APPLE { + found = pf.Base + } + for _, m := range pf.MsgNames { + if m.Name == APPLE { + found = m + break + } + } + if found == nil { + return fmt.Errorf("failed to find struct %s", APPLE) + } + + log.Printf("FOUND: %s %s for %s\n", APPLES, APPLE, FRUIT) + + found.addFindByMsg(wFind, FRUIT, APPLES, APPLE) + found.addAppendByMsg(wFind, FRUIT, APPLES, APPLE) + found.addDeleteByMsg(wFind, FRUIT, APPLES, APPLE) + found.addInsertByMsg(wFind, FRUIT, APPLES, APPLE) // new idea + + found.addSortByMsg(wSort, FRUIT, APPLES, APPLE) + } + return nil +} + +func (parent *MsgName) addFindByMsg(w io.Writer, FRUIT, APPLES, APPLE string) { + log.Printf("\tINSERT: %s %s for %s\n", APPLES, APPLE, FRUIT) + for _, v := range parent.Vars { + if v.HasUnique { + var COLOR string = cases.Title(language.English, cases.NoLower).String(v.VarName) + log.Printf("\t\t(x %s) InsertBy%s(string) *%s\n", FRUIT, COLOR, APPLE) + parent.findBy(w, FRUIT, APPLES, APPLE, COLOR) + } + } +} + +func (parent *MsgName) addDeleteByMsg(w io.Writer, FRUIT, APPLES, APPLE string) { + log.Printf("\tDELETE: %s %s for %s\n", APPLES, APPLE, FRUIT) + var COLORS []string + for _, v := range parent.Vars { + if !v.HasUnique { + continue + } + var COLOR string = cases.Title(language.English, cases.NoLower).String(v.VarName) + COLORS = append(COLORS, COLOR) + + log.Printf("\t\t(x %s) DeleteBy%s(string) *%s\n", FRUIT, COLOR, APPLE) + if argv.Delete { + parent.deleteByWithCopy(w, FRUIT, APPLES, APPLE, COLOR) + } else { + parent.deleteBy(w, FRUIT, APPLES, APPLE, COLOR) + } + } +} + +func (parent *MsgName) addInsertByMsg(w io.Writer, FRUIT, APPLES, APPLE string) { + log.Printf("\tINSERT: %s %s for %s\n", APPLES, APPLE, FRUIT) + for _, v := range parent.Vars { + if v.HasUnique { + var COLOR string = cases.Title(language.English, cases.NoLower).String(v.VarName) + log.Printf("\t\t(x %s) InsertBy%s(string) *%s\n", FRUIT, COLOR, APPLE) + parent.insertBy(w, FRUIT, APPLES, APPLE, COLOR) + } + } +} + +func (parent *MsgName) addAppendByMsg(w io.Writer, FRUIT, APPLES, APPLE string) { + log.Printf("\tAPPEND!: %s %s for %s\n", APPLES, APPLE, FRUIT) + var COLORS []string + + for _, v := range parent.Vars { + if v.HasUnique { + var COLOR string = cases.Title(language.English, cases.NoLower).String(v.VarName) + COLORS = append(COLORS, COLOR) + + log.Printf("\t\t(x %s) AppendUniqueBy%s(%s)\n", FRUIT, COLOR, APPLE) + parent.appendUniqueBy(w, FRUIT, APPLES, APPLE, COLOR) + } + } + if len(COLORS) > 0 { + parent.appendUnique(w, FRUIT, APPLES, APPLE, COLORS) + } +} + +func (parent *MsgName) addSortByMsg(w io.Writer, FRUIT, APPLES, APPLE string) { + log.Printf("\tSORT!: %s %s for %s\n", APPLES, APPLE, FRUIT) + + for _, v := range parent.Vars { + if v.HasSort { + // log.Printf("\tSort!: %s %s for %s\n", APPLES, APPLE, v.VarName) + newS := cases.Title(language.English, cases.NoLower).String(v.VarName) + log.Printf("\t\t(x %s) SortdBy%s() *%sIter\n", FRUIT, newS, APPLE) + } + } +} |
