@@ -27,36 +27,115 @@ impl<let NumBytes: u32, let NumPackedFields: u16, let MaxNumTokens: u16, let Max
27
27
let (exists , key_index ) = self .key_exists_impl (key , KeyBytes );
28
28
let entry : JSONEntry = JSONEntry ::from_field (self .packed_json_entries [key_index ]);
29
29
30
+ assert (
31
+ (entry .entry_type - BEGIN_ARRAY_TOKEN ) * exists as Field == 0 , "key does not describe an object"
32
+ );
33
+
34
+ let mut r = self ;
35
+ r .layer_id = entry .parent_index ;
36
+ r .root_id = entry .id ;
37
+ r .layer_context = ARRAY_LAYER ;
38
+ r .layer_index_in_transcript = key_index ;
39
+
40
+ Option { _is_some : exists , _value : r }
41
+ }
42
+
43
+ fn get_array_unchecked <let KeyBytes : u16 >(self , key : [u8 ; KeyBytes ]) -> Self {
44
+ assert (self .layer_context != ARRAY_LAYER , "cannot extract array elements via a key" );
45
+
46
+ let key_index = self .key_exists_impl_unchecked (key , KeyBytes );
47
+ let entry : JSONEntry = JSONEntry ::from_field (self .packed_json_entries [key_index ]);
48
+
30
49
assert (entry .entry_type == BEGIN_ARRAY_TOKEN , "key does not describe an object" );
31
50
32
- let mut result : Option <JSON <NumBytes , NumPackedFields , MaxNumTokens , MaxNumValues >> = Option ::none ();
33
- if (exists ) {
34
- let mut r = self ;
35
- r .layer_id = entry .parent_index ;
36
- r .layer_context = ARRAY_LAYER ;
37
- r .layer_index_in_transcript = key_index ;
38
- result = Option ::some (r );
39
- }
40
- result
51
+ let mut r = self ;
52
+ r .layer_id = entry .parent_index ;
53
+ r .root_id = entry .id ;
54
+ r .layer_context = ARRAY_LAYER ;
55
+ r .layer_index_in_transcript = key_index ;
56
+
57
+ r
41
58
}
42
59
60
+ fn get_array_unchecked_var <let KeyBytes : u16 >(self , key : [u8 ; KeyBytes ], key_length : u16 ) -> Self {
61
+ assert (self .layer_context != ARRAY_LAYER , "cannot extract array elements via a key" );
62
+
63
+ let key_index = self .key_exists_impl_unchecked (key , key_length );
64
+ let entry : JSONEntry = JSONEntry ::from_field (self .packed_json_entries [key_index ]);
65
+
66
+ assert (entry .entry_type == BEGIN_ARRAY_TOKEN , "key does not describe an object" );
67
+
68
+ let mut r = self ;
69
+ r .layer_id = entry .parent_index ;
70
+ r .root_id = entry .id ;
71
+ r .layer_context = ARRAY_LAYER ;
72
+ r .layer_index_in_transcript = key_index ;
73
+
74
+ r
75
+ }
43
76
fn get_array_var <let KeyBytes : u16 >(self , key : [u8 ; KeyBytes ], key_length : u16 ) -> Option <Self > {
44
77
assert (self .layer_context != ARRAY_LAYER , "cannot extract array elements via a key" );
45
78
let (exists , key_index ) = self .key_exists_impl (key , key_length );
46
79
let entry : JSONEntry = JSONEntry ::from_field (self .packed_json_entries [key_index ]);
47
80
48
81
// TODO: ADD A layer_context VARIABLE INTO JSON WHICH DESCRIBES WHETHER WE ARE AN OBJECT, ARRAY OR SINGLE VALUE
49
- assert (entry .entry_type == BEGIN_ARRAY_TOKEN , "key does not describe an object" );
82
+ assert (
83
+ (entry .entry_type - BEGIN_ARRAY_TOKEN ) * exists as Field == 0 , "key does not describe an object"
84
+ );
50
85
51
- let mut result : Option <JSON <NumBytes , NumPackedFields , MaxNumTokens , MaxNumValues >> = Option ::none ();
52
- if (exists ) {
53
- let mut r = self ;
54
- r .layer_id = entry .parent_index ;
55
- r .layer_context = ARRAY_LAYER ;
56
- r .layer_index_in_transcript = key_index ;
57
- result = Option ::some (r );
58
- }
59
- result
86
+ let mut r = self ;
87
+ r .layer_id = entry .parent_index ;
88
+ r .root_id = entry .id ;
89
+ r .layer_context = ARRAY_LAYER ;
90
+ r .layer_index_in_transcript = key_index ;
91
+
92
+ Option { _is_some : exists , _value : r }
93
+ }
94
+
95
+ fn get_array_from_array (self , array_index : Field ) -> Option <Self > {
96
+ assert (self .layer_context == ARRAY_LAYER , "can only acceess array elements from array" );
97
+
98
+ let parent_entry = JSONEntry ::from_field (self .packed_json_entries [self .layer_index_in_transcript ]);
99
+
100
+ let valid = lt_field_16_bit (array_index , parent_entry .num_children );
101
+ let entry_index = (parent_entry .child_pointer + array_index ) * valid as Field ;
102
+
103
+ let entry = JSONEntry ::from_field (self .packed_json_entries [entry_index ]);
104
+
105
+ assert (
106
+ (entry .entry_type - BEGIN_ARRAY_TOKEN ) * valid as Field == 0 , "get_object_from_array: entry exists but is not an object!"
107
+ );
108
+
109
+ let mut r = self ;
110
+ r .layer_id = entry .parent_index ;
111
+ r .root_id = entry .id ;
112
+ r .layer_context = ARRAY_LAYER ;
113
+ r .layer_index_in_transcript = entry_index ;
114
+
115
+ Option { _is_some : valid , _value : r }
116
+ }
117
+
118
+ fn get_array_from_array_unchecked (self , array_index : Field ) -> Self {
119
+ assert (self .layer_context == ARRAY_LAYER , "can only acceess array elements from array" );
120
+
121
+ let parent_entry = JSONEntry ::from_field (self .packed_json_entries [self .layer_index_in_transcript ]);
122
+
123
+ let valid = lt_field_16_bit (array_index , parent_entry .num_children );
124
+ assert (valid , "array overflow" );
125
+ let entry_index = (parent_entry .child_pointer + array_index );
126
+
127
+ let entry = JSONEntry ::from_field (self .packed_json_entries [entry_index ]);
128
+
129
+ assert (
130
+ entry .entry_type == BEGIN_ARRAY_TOKEN , "get_array_from_array_unchecked: entry exists but is not an array!"
131
+ );
132
+
133
+ let mut r = self ;
134
+ r .layer_id = entry .parent_index ;
135
+ r .root_id = entry .id ;
136
+ r .layer_context = ARRAY_LAYER ;
137
+ r .layer_index_in_transcript = entry_index ;
138
+ r
60
139
}
61
140
62
141
fn map <U , let MaxElements : u32 , let MaxElementBytes : u32 >(
@@ -88,10 +167,53 @@ impl<let NumBytes: u32, let NumPackedFields: u16, let MaxNumTokens: u16, let Max
88
167
89
168
if (valid ) {
90
169
r [i ] = f (
91
- JSONValue { length : child_entry .json_length , value : parsed_string , value_type : child_entry .entry_type }
170
+ JSONValue { value : BoundedVec { len : child_entry .json_length as u32 , storage : parsed_string } , value_type : child_entry .entry_type }
92
171
);
93
172
}
94
173
}
95
174
r
96
175
}
97
176
}
177
+
178
+ #[test]
179
+ fn test_array () {
180
+ let text = "{ \" foo\" : [ [1,2,3], [[3,4]], [[]], [], { \" bar\" : [\" b\" , \" a\" , \" z\" ]} ]}" ;
181
+
182
+ let mut json : JSON <_ , 7 , 60 , 60 > = JSON ::parse_json (text );
183
+
184
+ let first = json .get_array_unchecked ("foo" .as_bytes ());
185
+ assert (first .get_length () == 5 );
186
+
187
+ let A = first .get_array_from_array_unchecked (0 );
188
+ assert (A .get_length () == 3 );
189
+
190
+ let B = first .get_array_from_array_unchecked (1 );
191
+ assert (B .get_length () == 1 );
192
+
193
+ let C = first .get_array_from_array (2 ).unwrap ();
194
+ assert (C .get_length () == 1 );
195
+
196
+ // incorrect sorting. the object comes before the array. why?
197
+ //
198
+ let D = first .get_array_from_array_unchecked (3 );
199
+ assert (D .get_length () == 0 );
200
+
201
+ let B_A = B .get_array_from_array_unchecked (0 );
202
+ assert (B_A .get_length () == 2 );
203
+
204
+ let C_A = C .get_array_from_array_unchecked (0 );
205
+ assert (C_A .get_length () == 0 );
206
+
207
+ let fake = first .get_array_from_array (5 );
208
+ assert (fake .is_some () == false );
209
+
210
+ let E = first .get_object_from_array_unchecked (4 );
211
+
212
+ let entry_maybe = JSONEntry ::from_field (E .packed_json_entries [E .layer_index_in_transcript ]);
213
+ println (f"entry = { entry_maybe} " );
214
+ let child = JSONEntry ::from_field (E .packed_json_entries [entry_maybe .child_pointer ]);
215
+ println (f"target? = { child} " );
216
+ println (f"{ E} " );
217
+ let E_A = E .get_array_unchecked ("bar" .as_bytes ());
218
+ assert (E_A .get_length () == 3 );
219
+ }
0 commit comments