summaryrefslogtreecommitdiff
path: root/sort.go
blob: d55385262712bd9beaa7c72ce93fc6b42068f2f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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.Base, wSort, wFind)
	return nil
}

func (pf *File) processMessage(msg *MsgName, wSort, wFind io.Writer) error {
	log.Printf("%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)
	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 {
			// log.Printf("\tUniq!: %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) AppendUniqueBy%s(%s)\n", parent.Name, newS, find.VarType)
			var FRUIT string = parent.Name
			var APPLES string = cases.Title(language.English, cases.NoLower).String(find.VarName)
			var APPLE string = find.VarType
			var COLOR string = newS
			var FruitLock string
			if argv.Mutex {
				FruitLock = "x.Lock" // uses mutex frum protoc.pb.go file
			} else {
				FruitLock = FRUIT + ".Lock" // ugly global lock hack. should probably deprecate
			}
			appendUniqueBy(wFind, FRUIT, APPLES, APPLE, COLOR, FruitLock)
			log.Printf("\t(x %s) FindBy%s(string) *%s\n", parent.Name, newS, find.VarType)
			if v.VarType == "string" {
				log.Printf("\t(x %s) DeleteBy%s(string) *%s\n", parent.Name, newS, find.VarType)
			}
		}
	}
	return nil
}

func (pf *File) printMsgTable() {
	for _, msg := range pf.MsgNames {
		log.Printf("%s\n", msg.Name)
		for _, v := range msg.Vars {
			var end string
			if v.IsRepeated {
				end += "(repeated) "
			}
			if v.HasSort {
				end += "(sort) "
			}
			if v.HasUnique {
				end += "(unique) "
			}
			log.Printf("\t%s %s %s\n", v.VarName, v.VarType, end)
		}
	}
}