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) header(wFind, pf) if !argv.Mutex { pf.syncLock(wSort) } if argv.Mutex { // use the mutex lock from the modified protoc.pb.go file pf.Bases.Lockname = "all.Lock" } pf.Base.iterTop(wSort) pf.Base.iterNext(wSort) pf.selectAllFunc(wSort) pf.iterSelect(wSort) pf.appendUnique(wFind) // Append() enforce no unique keys pf.sortByFunc(wSort) if argv.Delete { pf.deleteWithCopyFunc(wFind) } else { pf.deleteFunc(wFind) } pf.findFunc(wFind) // attempt to add sort functions for pf.Base pf.processMessage(pf.Bases, wSort, wFind) // pf.processMessage(pf.Base, wSort, wFind) return nil } func (pf *File) processMessage(msg *MsgName, wSort, wFind io.Writer) error { log.Printf("ADDING FIND AND SORT FOR MESSAGE %s WITH %+v\n", msg.Name, msg.Vars) for _, v := range msg.Vars { if !v.IsRepeated { log.Printf("\tSKIP %s %s\n", v.VarName, v.VarType) continue } if err := pf.addSortByMsg(msg, v, wSort, wFind); err != nil { return err } } return nil } func (pf *File) addSortByMsg(parent *MsgName, find *MsgVar, wSort, wFind io.Writer) error { log.Printf("\tLOOK HERE: %s %s\n", find.VarName, find.VarType) var found *MsgName for _, msg := range pf.MsgNames { if msg.Name == find.VarType { found = msg break } } if found == nil { return fmt.Errorf("failed to find struct %s", find.VarType) } log.Printf("FOUND!: %s %s for %s\n", find.VarName, find.VarType, found.Name) var COLORS []string var FRUIT string = parent.Name var APPLES string = cases.Title(language.English, cases.NoLower).String(find.VarName) var APPLE string = find.VarType for _, v := range found.Vars { if v.HasSort { // log.Printf("\tSort!: %s %s for %s\n", find.VarName, find.VarType, v.VarName) newS := cases.Title(language.English, cases.NoLower).String(v.VarName) log.Printf("\t(x %s) SortdBy%s() *%sIter\n", parent.Name, newS, find.VarType) } if v.HasUnique { newS := cases.Title(language.English, cases.NoLower).String(v.VarName) var COLOR string = newS COLORS = append(COLORS, COLOR) log.Printf("\t(x %s) AppendUniqueBy%s(%s)\n", parent.Name, newS, find.VarType) parent.appendUniqueBy(wFind, FRUIT, APPLES, APPLE, COLOR) if v.VarType == "string" { log.Printf("\t(x %s) FindBy%s(string) *%s\n", FRUIT, COLOR, APPLE) parent.findBy(wFind, FRUIT, APPLES, APPLE, COLOR) log.Printf("\t(x %s) DeleteBy%s(string) *%s\n", parent.Name, newS, find.VarType) parent.deleteBy(wFind, FRUIT, APPLES, APPLE, COLOR) } } } if len(COLORS) > 0 { parent.appendUnique(wFind, FRUIT, APPLES, APPLE, COLORS) } return nil }