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 cmd
import (
"strings"
"github.com/fvbommel/sortorder"
)
// StringList represents the type for sorting nested string lists.
type StringList [][]string
func (a StringList) Len() int {
return len(a)
}
func (a StringList) Swap(i, j int) {
a[i], a[j] = a[j], a[i]
}
func (a StringList) Less(i, j int) bool {
x := 0
for x = range a[i] {
if a[i][x] != a[j][x] {
break
}
}
if a[i][x] == "" {
return false
}
if a[j][x] == "" {
return true
}
return sortorder.NaturalLess(a[i][x], a[j][x])
}
// SortColumnsNaturally represents the type for sorting columns in a natural order from left to right.
type SortColumnsNaturally [][]string
func (a SortColumnsNaturally) Len() int {
return len(a)
}
func (a SortColumnsNaturally) Swap(i, j int) {
a[i], a[j] = a[j], a[i]
}
func (a SortColumnsNaturally) Less(i, j int) bool {
for k := range a[i] {
if a[i][k] == a[j][k] {
continue
}
if a[i][k] == "" {
return false
}
if a[j][k] == "" {
return true
}
return sortorder.NaturalLess(a[i][k], a[j][k])
}
return false
}
// ByNameAndType represents the type for sorting Storage volumes.
type ByNameAndType [][]string
func (a ByNameAndType) Len() int {
return len(a)
}
func (a ByNameAndType) Swap(i, j int) {
a[i], a[j] = a[j], a[i]
}
func (a ByNameAndType) Less(i, j int) bool {
// Sort snapshot and parent together.
iType := strings.Split(a[i][0], " ")[0]
jType := strings.Split(a[j][0], " ")[0]
if iType != jType {
return sortorder.NaturalLess(a[i][0], a[j][0])
}
if a[i][1] == "" {
return false
}
if a[j][1] == "" {
return true
}
return sortorder.NaturalLess(a[i][1], a[j][1])
}
|