Skip to content

Commit fb12cc0

Browse files
committed
feat: decode arrays
1 parent 93a449b commit fb12cc0

2 files changed

Lines changed: 29 additions & 8 deletions

File tree

decode.v

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ pub fn (mut d Decoder) decode_from_string[T](data string) ! {
3535
pub fn (mut d Decoder) decode[T](data []u8, mut val T) ! {
3636
d.buffer = data
3737
d.next()!
38+
println(d.buffer)
39+
println(d.bd)
3840

3941
$if T is $int {
4042
d.decode_integer[T](mut val) or { return error('error decoding integer: ${err}') }
@@ -146,12 +148,27 @@ pub fn (mut d Decoder) decode_binary[T](mut val T) ! {
146148
}
147149

148150
pub fn (mut d Decoder) decode_array[T](mut val T) ! {
151+
decode_array(mut val, mut d)!
152+
}
153+
154+
@[deprecated: 'waiting #20033 be solved']
155+
fn decode_array[T](mut val []T, mut d Decoder) ! {
149156
data := d.buffer
150157
match d.bd {
151158
mp_array_16, mp_array_32, mp_fix_array_min...mp_fix_array_max {
152159
array_len := d.read_array_len(data) or { return error('error reading array length') }
160+
elements_buffer := data[1..]
161+
162+
mut d_for_array := new_decoder()
163+
153164
for _ in 0 .. array_len {
154-
// TODO
165+
mut element := T{}
166+
167+
d_for_array.decode[T](elements_buffer, mut element) or {
168+
return error('error decoding array element')
169+
}
170+
171+
val << element
155172
}
156173
}
157174
else {

decode_test.v

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,18 @@ fn test_decoding() {
2020
assert msgpack.decode[string](hex.decode('a0')!)! == '' // Test empty string
2121

2222
// Test decoding arrays
23-
// assert msgpack.decode[[]int](hex.decode('93d200000001d200000002d200000003')!)! == [1, 2, 3]
24-
25-
// msgpack.decode[[]u8](msgpack.encode([u8(1),1,2]))!
26-
// msgpack.decode[[]int](msgpack.encode([1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]))!
27-
// msgpack.decode[[]u32](msgpack.encode([u32(1),1,2]))!
23+
assert msgpack.decode[[]int](hex.decode('93d200000001d200000002d200000003')!)! == [
24+
1,
25+
2,
26+
3,
27+
]
28+
29+
// assert msgpack.decode[[]u8](msgpack.encode([u8(1),1,2]))! == [u8(1),1,2]
30+
// asser msgpack.decode[[]int](msgpack.encode([1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]))! == [1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
31+
assert msgpack.decode[[]u32](msgpack.encode([u32(1), 1, 2]))! == [u32(1), 1, 2]
2832
// assert msgpack.decode[[]u8](msgpack.encode([u8(1),1,1]))! == [u8(1), 2, 3]
29-
// assert msgpack.decode[[]int](msgpack.encode([1,1,1]))! == [1, 2, 3]
30-
// assert msgpack.decode[[]int](hex.decode('90')!)! == [] // Test empty array
33+
assert msgpack.decode[[]int](msgpack.encode([1, 1, 1]))! == [1, 1, 1]
34+
assert msgpack.decode[[]int](hex.decode('90')!)! == []
3135

3236
// // Test decoding maps
3337
// assert msgpack.decode[map[string]string](hex.decode('82a46e616d65a44a6f686ea3616765a23330')!)! == {

0 commit comments

Comments
 (0)