-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
deltas.go
142 lines (117 loc) · 2.13 KB
/
deltas.go
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package ui
import (
"regexp"
"strconv"
"strings"
"time"
"github.com/derailed/k9s/internal/render"
"k8s.io/apimachinery/pkg/api/resource"
)
const (
// DeltaSign signals a diff.
DeltaSign = "Δ"
// PlusSign signals inc.
PlusSign = "[red::b]↑"
// MinusSign signal dec.
MinusSign = "[green::b]↓"
)
var percent = regexp.MustCompile(`\A(\d+)\%\z`)
func deltaNumb(o, n string) (string, bool) {
var delta string
i, ok := numerical(o)
if !ok {
return delta, ok
}
j, _ := numerical(n)
switch {
case i < j:
delta = PlusSign
case i > j:
delta = MinusSign
}
return delta, ok
}
func deltaPerc(o, n string) (string, bool) {
var delta string
i, ok := percentage(o)
if !ok {
return delta, ok
}
j, _ := percentage(n)
switch {
case i < j:
delta = PlusSign
case i > j:
delta = MinusSign
}
return delta, ok
}
func deltaQty(o, n string) (string, bool) {
var delta string
q1, err := resource.ParseQuantity(o)
if err != nil {
return delta, false
}
q2, _ := resource.ParseQuantity(n)
switch q1.Cmp(q2) {
case -1:
delta = PlusSign
case 1:
delta = MinusSign
}
return delta, true
}
func deltaDur(o, n string) (string, bool) {
var delta string
d1, err := time.ParseDuration(o)
if err != nil {
return delta, false
}
d2, _ := time.ParseDuration(n)
switch {
case d2-d1 > 0:
delta = PlusSign
case d2-d1 < 0:
delta = MinusSign
}
return delta, true
}
// Deltas signals diffs between 2 strings.
func Deltas(o, n string) string {
o, n = strings.TrimSpace(o), strings.TrimSpace(n)
if o == "" || o == render.NAValue {
return ""
}
if d, ok := deltaNumb(o, n); ok {
return d
}
if d, ok := deltaPerc(o, n); ok {
return d
}
if d, ok := deltaQty(o, n); ok {
return d
}
if d, ok := deltaDur(o, n); ok {
return d
}
switch strings.Compare(o, n) {
case 1, -1:
return DeltaSign
default:
return ""
}
}
func percentage(s string) (int, bool) {
if res := percent.FindStringSubmatch(s); len(res) == 2 {
n, _ := strconv.Atoi(res[1])
return n, true
}
return 0, false
}
func numerical(s string) (int, bool) {
n, err := strconv.Atoi(s)
if err != nil {
return 0, false
}
return n, true
}