Skip to content

Commit e16d727

Browse files
authored
x.json2.decoder2: rename fields, add more comments (#22037)
1 parent e8305d2 commit e16d727

File tree

1 file changed

+80
-79
lines changed

1 file changed

+80
-79
lines changed

vlib/x/json2/decoder2/decode.v

Lines changed: 80 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@ module decoder2
22

33
import time
44

5+
// Node represents a node in a JSON decoder tree.
56
struct Node {
6-
key_pos int
7-
key_len int
8-
children ?[]Node
7+
key_pos int // The position of the key in the JSON string.
8+
key_len int // The length of the key in the JSON string.
9+
children ?[]Node // The children nodes of the current node.
910
}
1011

12+
// Decoder represents a JSON decoder.
1113
struct Decoder {
12-
json_data string
14+
json string // json is the JSON data to be decoded.
1315
mut:
14-
idx int
16+
idx int // idx is the current index of the decoder.
1517
}
1618

1719
pub enum ValueKind {
@@ -37,7 +39,7 @@ pub fn decode[T](val string) !T {
3739
mut nodes := []Node{}
3840

3941
mut decoder := Decoder{
40-
json_data: val
42+
json: val
4143
}
4244

4345
// TODO needs performance improvements
@@ -96,30 +98,30 @@ fn (mut decoder Decoder) decode_optional_value_in_actual_node[T](node Node, val
9698
start := (node.key_pos + node.key_len) + 3
9799
mut end := start
98100
for {
99-
if decoder.json_data[end] == `,` || decoder.json_data[end] == `}` {
101+
if decoder.json[end] == `,` || decoder.json[end] == `}` {
100102
break
101103
}
102104

103105
end++
104106
}
105-
mut value_kind := get_value_kind(decoder.json_data[start])
107+
mut value_kind := get_value_kind(decoder.json[start])
106108

107109
$if T is string {
108110
if value_kind == .string_ {
109-
return decoder.json_data[start + 1..end - 1]
111+
return decoder.json[start + 1..end - 1]
110112
} else if value_kind == .object {
111113
} else if value_kind == .array {
112114
} else {
113-
return decoder.json_data[start..end]
115+
return decoder.json[start..end]
114116
}
115117
return ''
116118
} $else $if T is $int {
117119
if value_kind == .string_ {
118-
return decoder.json_data[start + 1..end - 1].int()
120+
return decoder.json[start + 1..end - 1].int()
119121
} else if value_kind == .object {
120122
} else if value_kind == .array {
121123
} else {
122-
return decoder.json_data[start..end].int()
124+
return decoder.json[start..end].int()
123125
}
124126
}
125127
return T{}
@@ -132,36 +134,37 @@ fn (mut decoder Decoder) decode_struct[T](nodes []Node, value &T) {
132134
mut node := nodes[i]
133135

134136
if node.key_len == field.name.len {
137+
// This `vmemcmp` compares the name of a key in a JSON with a given struct field.
135138
if unsafe {
136-
vmemcmp(decoder.json_data.str + node.key_pos, field.name.str, field.name.len) == 0
139+
vmemcmp(decoder.json.str + node.key_pos, field.name.str, field.name.len) == 0
137140
} {
138141
start := (node.key_pos + node.key_len) + 3
139142
mut end := start
140143
for {
141-
if decoder.json_data[end] == `,` || decoder.json_data[end] == `}` {
144+
if decoder.json[end] == `,` || decoder.json[end] == `}` {
142145
break
143146
}
144147

145148
end++
146149
}
147150

148-
mut value_kind := get_value_kind(decoder.json_data[start])
151+
mut value_kind := get_value_kind(decoder.json[start])
149152
$if field.indirections != 0 {
150153
// REVIEW Needs clone?
151154
$if field.indirections == 1 {
152155
// TODO
153156
// unsafe {
154-
// value.$(field.name) = &(decoder.json_data[start + 1..end - 1])
157+
// value.$(field.name) = &(decoder.json[start + 1..end - 1])
155158
// }
156159
} $else $if field.indirections == 2 {
157160
// TODO
158161
// unsafe {
159-
// value.$(field.name) = &&(decoder.json_data[start + 1..end - 1])
162+
// value.$(field.name) = &&(decoder.json[start + 1..end - 1])
160163
// }
161164
} $else $if field.indirections == 3 {
162165
// TODO
163166
// unsafe {
164-
// value.$(field.name) = &&&(decoder.json_data[start + 1..end - 1])
167+
// value.$(field.name) = &&&(decoder.json[start + 1..end - 1])
165168
// }
166169
}
167170
} $else $if field.typ is $option {
@@ -176,48 +179,48 @@ fn (mut decoder Decoder) decode_struct[T](nodes []Node, value &T) {
176179
$for v in workaround.variants {
177180
$if v.typ is string {
178181
if value_kind == .string_ {
179-
// value.$(field.name) = decoder.json_data[start + 1..end - 1]
182+
// value.$(field.name) = decoder.json[start + 1..end - 1]
180183
} else {
181-
// value.$(field.name) = decoder.json_data[start..end]
184+
// value.$(field.name) = decoder.json[start..end]
182185
}
183186
} $else $if v.typ in [$int, $float] {
184187
$if v.typ is u32 {
185-
value.$(field.name) = decoder.json_data[start..end].u32()
188+
value.$(field.name) = decoder.json[start..end].u32()
186189
} $else $if v.typ is u32 {
187190
}
188191

189192
$if v.typ is i8 {
190-
value.$(field.name) = decoder.json_data[start..end].i8()
193+
value.$(field.name) = decoder.json[start..end].i8()
191194
} $else $if v.typ is i16 {
192-
value.$(field.name) = decoder.json_data[start..end].i16()
195+
value.$(field.name) = decoder.json[start..end].i16()
193196
} $else $if v.typ is i32 {
194-
value.$(field.name) = decoder.json_data[start..end].i32()
197+
value.$(field.name) = decoder.json[start..end].i32()
195198
} $else $if v.typ is int {
196-
value.$(field.name) = decoder.json_data[start..end].int()
199+
value.$(field.name) = decoder.json[start..end].int()
197200
} $else $if v.typ is i64 {
198-
value.$(field.name) = decoder.json_data[start..end].i64()
201+
value.$(field.name) = decoder.json[start..end].i64()
199202
} $else $if v.typ is u8 {
200-
value.$(field.name) = decoder.json_data[start..end].u8()
203+
value.$(field.name) = decoder.json[start..end].u8()
201204
} $else $if v.typ is u16 {
202-
value.$(field.name) = decoder.json_data[start..end].u16()
205+
value.$(field.name) = decoder.json[start..end].u16()
203206
} $else $if v.typ is u32 {
204-
value.$(field.name) = decoder.json_data[start..end].u32()
207+
value.$(field.name) = decoder.json[start..end].u32()
205208
} $else $if v.typ is u64 {
206-
value.$(field.name) = decoder.json_data[start..end].u64()
209+
value.$(field.name) = decoder.json[start..end].u64()
207210
} $else $if v.typ is f32 {
208-
value.$(field.name) = decoder.json_data[start..end].f32()
211+
value.$(field.name) = decoder.json[start..end].f32()
209212
} $else $if v.typ is f64 {
210-
value.$(field.name) = decoder.json_data[start..end].f64()
213+
value.$(field.name) = decoder.json[start..end].f64()
211214
}
212215
} $else $if v.typ is bool {
213-
if decoder.json_data[start] == `t` {
216+
if decoder.json[start] == `t` {
214217
value.$(field.name) = true
215-
} else if decoder.json_data[start] == `f` {
218+
} else if decoder.json[start] == `f` {
216219
value.$(field.name) = false
217220
}
218221
} $else $if v.typ is time.Time {
219222
if value_kind == .string_ {
220-
value.$(field.name) = time.parse(decoder.json_data[start + 1..end - 1]) or {
223+
value.$(field.name) = time.parse(decoder.json[start + 1..end - 1]) or {
221224
time.Time{}
222225
}
223226
}
@@ -242,56 +245,56 @@ fn (mut decoder Decoder) decode_struct[T](nodes []Node, value &T) {
242245
}
243246
}
244247
if value_kind == .string_ {
245-
// value.$(field.name) = decoder.json_data[start + 1..end - 1]
246-
} else if decoder.json_data[start] == `t` {
248+
// value.$(field.name) = decoder.json[start + 1..end - 1]
249+
} else if decoder.json[start] == `t` {
247250
value.$(field.name) = true
248-
} else if decoder.json_data[start] == `f` {
251+
} else if decoder.json[start] == `f` {
249252
value.$(field.name) = false
250253
} else if value_kind == .object {
251254
} else if value_kind == .array {
252255
} else if value_kind == .number {
253-
// value.$(field.name) = decoder.json_data[start..end].int()
256+
// value.$(field.name) = decoder.json[start..end].int()
254257
} else {
255258
}
256259
} $else $if field.typ is string {
257260
if value_kind == .string_ {
258-
value.$(field.name) = decoder.json_data[start + 1..end - 1]
261+
value.$(field.name) = decoder.json[start + 1..end - 1]
259262
} else {
260-
value.$(field.name) = decoder.json_data[start..end]
263+
value.$(field.name) = decoder.json[start..end]
261264
}
262265
} $else $if field.typ in [$int, $float] {
263266
$if field.typ is i8 {
264-
value.$(field.name) = decoder.json_data[start..end].i8()
267+
value.$(field.name) = decoder.json[start..end].i8()
265268
} $else $if field.typ is i16 {
266-
value.$(field.name) = decoder.json_data[start..end].i16()
269+
value.$(field.name) = decoder.json[start..end].i16()
267270
} $else $if field.typ is i32 {
268-
value.$(field.name) = decoder.json_data[start..end].i32()
271+
value.$(field.name) = decoder.json[start..end].i32()
269272
} $else $if field.typ is int {
270-
value.$(field.name) = decoder.json_data[start..end].int()
273+
value.$(field.name) = decoder.json[start..end].int()
271274
} $else $if field.typ is i64 {
272-
value.$(field.name) = decoder.json_data[start..end].i64()
275+
value.$(field.name) = decoder.json[start..end].i64()
273276
} $else $if field.typ is u8 {
274-
value.$(field.name) = decoder.json_data[start..end].u8()
277+
value.$(field.name) = decoder.json[start..end].u8()
275278
} $else $if field.typ is u16 {
276-
value.$(field.name) = decoder.json_data[start..end].u16()
279+
value.$(field.name) = decoder.json[start..end].u16()
277280
} $else $if field.typ is u32 {
278-
value.$(field.name) = decoder.json_data[start..end].u32()
281+
value.$(field.name) = decoder.json[start..end].u32()
279282
} $else $if field.typ is u64 {
280-
value.$(field.name) = decoder.json_data[start..end].u64()
283+
value.$(field.name) = decoder.json[start..end].u64()
281284
} $else $if field.typ is f32 {
282-
value.$(field.name) = decoder.json_data[start..end].f32()
285+
value.$(field.name) = decoder.json[start..end].f32()
283286
} $else $if field.typ is f64 {
284-
value.$(field.name) = decoder.json_data[start..end].f64()
287+
value.$(field.name) = decoder.json[start..end].f64()
285288
}
286289
} $else $if field.typ is bool {
287-
if decoder.json_data[start] == `t` {
290+
if decoder.json[start] == `t` {
288291
value.$(field.name) = true
289-
} else if decoder.json_data[start] == `f` {
292+
} else if decoder.json[start] == `f` {
290293
value.$(field.name) = false
291294
}
292295
} $else $if field.typ is time.Time {
293296
if value_kind == .string_ {
294-
value.$(field.name) = time.parse_rfc3339(decoder.json_data[start + 1..end - 1]) or {
297+
value.$(field.name) = time.parse_rfc3339(decoder.json[start + 1..end - 1]) or {
295298
time.Time{}
296299
}
297300
}
@@ -313,37 +316,37 @@ fn (mut decoder Decoder) decode_struct[T](nodes []Node, value &T) {
313316
}
314317
}
315318
} $else $if field.typ is $enum {
316-
value.$(field.name) = decoder.json_data[start..end].int()
319+
value.$(field.name) = decoder.json[start..end].int()
317320
} $else $if field.typ is $alias {
318321
$if field.unaliased_typ is string {
319322
if value_kind == .string_ {
320-
value.$(field.name) = decoder.json_data[start + 1..end - 1]
323+
value.$(field.name) = decoder.json[start + 1..end - 1]
321324
}
322325
} $else $if field.unaliased_typ is time.Time {
323326
} $else $if field.unaliased_typ is bool {
324327
} $else $if field.unaliased_typ in [$float, $int] {
325328
$if field.unaliased_typ is i8 {
326-
value.$(field.name) = decoder.json_data[start..end].i8()
329+
value.$(field.name) = decoder.json[start..end].i8()
327330
} $else $if field.unaliased_typ is i16 {
328-
value.$(field.name) = decoder.json_data[start..end].i16()
331+
value.$(field.name) = decoder.json[start..end].i16()
329332
} $else $if field.unaliased_typ is i32 {
330-
value.$(field.name) = decoder.json_data[start..end].i32()
333+
value.$(field.name) = decoder.json[start..end].i32()
331334
} $else $if field.unaliased_typ is int {
332-
value.$(field.name) = decoder.json_data[start..end].int()
335+
value.$(field.name) = decoder.json[start..end].int()
333336
} $else $if field.unaliased_typ is i64 {
334-
value.$(field.name) = decoder.json_data[start..end].i64()
337+
value.$(field.name) = decoder.json[start..end].i64()
335338
} $else $if field.unaliased_typ is u8 {
336-
value.$(field.name) = decoder.json_data[start..end].u8()
339+
value.$(field.name) = decoder.json[start..end].u8()
337340
} $else $if field.unaliased_typ is u16 {
338-
value.$(field.name) = decoder.json_data[start..end].u16()
341+
value.$(field.name) = decoder.json[start..end].u16()
339342
} $else $if field.unaliased_typ is u32 {
340-
value.$(field.name) = decoder.json_data[start..end].u32()
343+
value.$(field.name) = decoder.json[start..end].u32()
341344
} $else $if field.unaliased_typ is u64 {
342-
value.$(field.name) = decoder.json_data[start..end].u64()
345+
value.$(field.name) = decoder.json[start..end].u64()
343346
} $else $if field.unaliased_typ is f32 {
344-
value.$(field.name) = decoder.json_data[start..end].f32()
347+
value.$(field.name) = decoder.json[start..end].f32()
345348
} $else $if field.unaliased_typ is f64 {
346-
value.$(field.name) = decoder.json_data[start..end].f64()
349+
value.$(field.name) = decoder.json[start..end].f64()
347350
}
348351
} $else $if field.unaliased_typ is $array {
349352
// TODO
@@ -375,20 +378,19 @@ fn (mut decoder Decoder) decode_map[T](nodes []Node, mut val T) {
375378
mut end := start
376379

377380
for {
378-
if decoder.json_data[end] == `,` || decoder.json_data[end] == `}` {
381+
if decoder.json[end] == `,` || decoder.json[end] == `}` {
379382
break
380383
}
381384

382385
end++
383386
}
384387

385-
mut value_kind := get_value_kind(decoder.json_data[start])
388+
mut value_kind := get_value_kind(decoder.json[start])
386389

387390
if value_kind == .string_ {
388-
val[decoder.json_data[node.key_pos..node.key_pos + node.key_len]] = decoder.json_data[
389-
start + 1..end - 1]
391+
val[decoder.json[node.key_pos..node.key_pos + node.key_len]] = decoder.json[start + 1..end - 1]
390392
} else {
391-
val[decoder.json_data[node.key_pos..node.key_pos + node.key_len]] = decoder.json_data[start..end]
393+
val[decoder.json[node.key_pos..node.key_pos + node.key_len]] = decoder.json[start..end]
392394
}
393395
}
394396
}
@@ -399,15 +401,14 @@ fn (mut decoder Decoder) fulfill_nodes(mut nodes []Node) {
399401
mut inside_key := false
400402

401403
mut actual_key_len := 0
402-
for decoder.idx < decoder.json_data.len {
403-
letter := decoder.json_data[decoder.idx]
404+
for decoder.idx < decoder.json.len {
405+
letter := decoder.json[decoder.idx]
404406
if letter == ` ` && !inside_string {
405407
} else if letter == `\"` {
406-
if decoder.json_data[decoder.idx - 1] == `{`
407-
|| decoder.json_data[decoder.idx - 2] == `,` {
408+
if decoder.json[decoder.idx - 1] == `{` || decoder.json[decoder.idx - 2] == `,` {
408409
inside_key = true
409-
} else if decoder.json_data[decoder.idx + 1] == `:` {
410-
if decoder.json_data[decoder.idx + 3] == `{` {
410+
} else if decoder.json[decoder.idx + 1] == `:` {
411+
if decoder.json[decoder.idx + 3] == `{` {
411412
mut children := []Node{}
412413
key_pos := decoder.idx - actual_key_len
413414
key_len := actual_key_len

0 commit comments

Comments
 (0)