-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsort.go
More file actions
101 lines (88 loc) · 2.34 KB
/
sort.go
File metadata and controls
101 lines (88 loc) · 2.34 KB
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
package main
import (
"sort"
)
type lessFunc func(p1, p2 *Configuration) bool
type multiSorter struct {
configurations []Configuration
less []lessFunc
}
func (ms *multiSorter) Sort(configurations []Configuration) {
ms.configurations = configurations
sort.Sort(ms)
}
func OrderBy(lessFuncs [][]lessFunc) *multiSorter {
if len(lessFuncs) > 0 {
for _,lessFunc := range lessFuncs {
return &multiSorter {
less: lessFunc,
}
}
}
return &multiSorter {}
}
func (ms *multiSorter) Len() int {
return len(ms.configurations)
}
func (ms *multiSorter) Swap(i, j int) {
ms.configurations[i], ms.configurations[j] = ms.configurations[j], ms.configurations[i]
}
func (ms *multiSorter) Less(i, j int) bool {
p, q := &ms.configurations[i], &ms.configurations[j]
var k int
for k = 0; k < len(ms.less)-1; k++ {
less := ms.less[k]
switch {
case less(p,q):
return true
case less(q,p):
return false
}
}
return ms.less[k](p,q)
}
var SortByNameAsc = func(c1, c2 *Configuration) bool {
return c1.Name < c2.Name
}
var SortByNameDesc = func(c1, c2 *Configuration) bool {
return c1.Name > c2.Name
}
var SortByHostnameAsc = func(c1, c2 *Configuration) bool {
return c1.Hostname < c2.Hostname
}
var SortByHostnameDesc = func(c1, c2 *Configuration) bool {
return c1.Hostname < c2.Hostname
}
var SortByPortAsc = func(c1, c2 *Configuration) bool {
return c1.Port < c2.Port
}
var SortByPortDesc = func(c1, c2 *Configuration) bool {
return c1.Port > c2.Port
}
var SortByUsernameAsc = func(c1, c2 *Configuration) bool {
return c1.Port > c2.Port
}
var SortByUsernameDesc = func(c1, c2 *Configuration) bool {
return c1.Port > c2.Port
}
var sort_keys = map[string]func(c1, c2 *Configuration) bool {
"name" : SortByNameAsc,
"name:asc" : SortByNameAsc,
"name:desc" : SortByNameDesc,
"hostname" : SortByHostnameAsc,
"hostname:asc" : SortByHostnameAsc,
"hostname:desc" : SortByHostnameDesc,
"port" : SortByPortAsc,
"port:asc" : SortByPortAsc,
"port:desc" : SortByPortDesc,
"username" : SortByUsernameAsc,
"username:asc" : SortByUsernameAsc,
"username:desc" : SortByUsernameDesc,
}
func SortConfigs(fields []string, c Configurations) {
fieldLessFuncs := make([][]lessFunc,len(fields))
for i,el := range fields {
fieldLessFuncs[i] = []lessFunc{sort_keys[el]}
}
OrderBy(fieldLessFuncs).Sort(c.List)
}