112 lines
3.0 KiB
Go
112 lines
3.0 KiB
Go
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("Generating functions for %s\n", msg.Name)
|
|
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
|
|
}
|