forked from mailgun/kafka-pixy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
prettyfmt.go
75 lines (69 loc) · 1.44 KB
/
prettyfmt.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
package prettyfmt
import (
"fmt"
"unicode"
)
// Bytes returns human friendly string representation of the number of bytes.
func Bytes(bytes int64) string {
kilo := bytes / 1024
if kilo == 0 {
return fmt.Sprintf("%d", bytes)
}
mega := kilo / 1024
if mega == 0 {
return fmt.Sprintf("%dK", kilo)
}
giga := mega / 1024
if giga == 0 {
return fmt.Sprintf("%dM", mega)
}
return fmt.Sprintf("%dG", giga)
}
const (
collapseStateOutside = iota
collapseStateSkip
collapseStateID
)
// CollapseJSON takes as input the output of json.MarshalIndent function and
// puts all lists to the same line. It was not intended to solve this problem
// in general case and works on a very limited set of inputs. Specifically to
// make the output of the `GET /topics/<>/consumers` API method look compact.
func CollapseJSON(bytes []byte) []byte {
state := collapseStateOutside
j := 0
for i := 0; i < len(bytes); i++ {
c := rune(bytes[i])
switch state {
case collapseStateOutside:
if c == '[' {
state = collapseStateSkip
}
case collapseStateSkip:
if c == ']' {
state = collapseStateOutside
break
}
if unicode.IsDigit(c) {
state = collapseStateID
break
}
continue
case collapseStateID:
if unicode.IsDigit(c) {
break
}
if c == ']' {
state = collapseStateOutside
break
}
if c == ',' {
state = collapseStateSkip
break
}
continue
}
bytes[j] = bytes[i]
j++
}
return bytes[:j]
}