v
Зеркало из https://github.com/vlang/v
1module json2
2
3import time
4
5struct Count {
6mut:
7total int
8}
9
10// get_total
11fn (mut count Count) get_total() int {
12return count.total
13}
14
15// reset_total
16fn (mut count Count) reset_total() {
17count.total = 0
18}
19
20// count_chars count json sizen without new encode
21fn (mut count Count) count_chars[T](val T) {
22$if val is $option {
23workaround := val
24if workaround != none {
25count.count_chars(val)
26}
27} $else $if T is string {
28count.chars_in_string(val)
29} $else $if T is $sumtype {
30$for v in val.variants {
31if val is v {
32count.count_chars(val)
33}
34}
35} $else $if T is $alias {
36// TODO
37} $else $if T is time.Time {
38count.total += 26 // "YYYY-MM-DDTHH:mm:ss.123Z"
39} $else $if T is $map {
40count.total++ // {
41for k, v in val {
42count.count_chars(k)
43count.total++ // :
44count.count_chars(v)
45}
46count.total++ // }
47} $else $if T is $array {
48count.total += 2 // []
49if val.len > 0 {
50for element in val {
51count.count_chars(element)
52}
53count.total += val.len - 1 // ,
54}
55} $else $if T is $struct {
56count.chars_in_struct(val)
57} $else $if T is $enum {
58count.count_chars(int(val))
59} $else $if T is $int {
60// TODO: benchmark
61mut abs_val := val
62if val < 0 {
63count.total++ // -
64abs_val = -val
65}
66for number_value := abs_val; number_value >= 1; number_value /= 10 {
67count.total++
68}
69if val == 0 {
70count.total++
71}
72} $else $if T is $float {
73// TODO
74} $else $if T is bool {
75if val {
76count.total += 4 // true
77} else {
78count.total += 5 // false
79}
80} $else {
81}
82}
83
84// chars_in_struct
85fn (mut count Count) chars_in_struct[T](val T) {
86count.total += 2 // {}
87$for field in T.fields {
88// TODO: handle attributes
89count.total += field.name.len + 3 // "":
90workaround := val.$(field.name)
91count.count_chars(workaround)
92}
93}
94
95// chars_in_string
96fn (mut count Count) chars_in_string(val string) {
97count.total += val.len + 2 // ""
98}
99