1
1
use crate::json_entry::JSONEntry ;
2
2
use crate::json::JSON ;
3
3
use crate::lt::lt_field_16_bit ;
4
- use crate::json_tables:: { OBJECT_LAYER , ARRAY_LAYER , BEGIN_ARRAY_TOKEN } ;
5
- use crate::keyhash::get_keyhash ;
4
+ use crate::enums::Token::END_ARRAY_TOKEN ;
5
+ use crate::enums::Layer:: { OBJECT_LAYER , ARRAY_LAYER } ;
6
6
use crate::getters::JSONValue ;
7
7
8
8
/**
@@ -14,8 +14,8 @@ impl<let NumBytes: u32, let NumPackedFields: u16, let MaxNumTokens: u16, let Max
14
14
* @brief if the root JSON is an array, return its length
15
15
**/
16
16
fn get_length (self ) -> u32 {
17
- assert (self .layer_context == ARRAY_LAYER , "can only get length of an array type" );
18
- let parent_entry : JSONEntry = self .packed_json_entries [self .layer_index_in_transcript ].into ();
17
+ assert (self .layer_type_of_root == ARRAY_LAYER , "can only get length of an array type" );
18
+ let parent_entry : JSONEntry = self .json_entries_packed [self .root_index_in_transcript ].into ();
19
19
parent_entry .num_children as u32
20
20
}
21
21
@@ -24,18 +24,18 @@ impl<let NumBytes: u32, let NumPackedFields: u16, let MaxNumTokens: u16, let Max
24
24
* @description returns an Option<JSON> where, if the array exists, the JSON object will have the requested array as its root value
25
25
**/
26
26
fn get_array <let KeyBytes : u16 >(self , key : [u8 ; KeyBytes ]) -> Option <Self > {
27
- assert (self .layer_context != ARRAY_LAYER , "cannot extract array elements via a key" );
27
+ assert (self .layer_type_of_root != ARRAY_LAYER , "cannot extract array elements via a key" );
28
28
let (exists , key_index ) = self .key_exists_impl (key , KeyBytes );
29
- let entry : JSONEntry = self .packed_json_entries [key_index ].into ();
29
+ let entry : JSONEntry = self .json_entries_packed [key_index ].into ();
30
30
assert (
31
- (entry .entry_type - BEGIN_ARRAY_TOKEN ) * exists as Field == 0 , "key does not describe an object"
31
+ (entry .entry_type - END_ARRAY_TOKEN ) * exists as Field == 0 , "key does not describe an object"
32
32
);
33
33
34
34
let mut r = self ;
35
- r .layer_id = entry .parent_index ;
35
+ r .layer_type_of_root = entry .parent_index ;
36
36
r .root_id = entry .id ;
37
- r .layer_context = ARRAY_LAYER ;
38
- r .layer_index_in_transcript = key_index ;
37
+ r .layer_type_of_root = ARRAY_LAYER ;
38
+ r .root_index_in_transcript = key_index ;
39
39
40
40
Option { _is_some : exists , _value : r }
41
41
}
@@ -45,16 +45,16 @@ impl<let NumBytes: u32, let NumPackedFields: u16, let MaxNumTokens: u16, let Max
45
45
* @description will revert if the array does not exist
46
46
**/
47
47
fn get_array_unchecked <let KeyBytes : u16 >(self , key : [u8 ; KeyBytes ]) -> Self {
48
- assert (self .layer_context != ARRAY_LAYER , "cannot extract array elements via a key" );
48
+ assert (self .layer_type_of_root != ARRAY_LAYER , "cannot extract array elements via a key" );
49
49
50
50
let (entry , key_index ) = self .get_json_entry_unchecked_with_key_index_var (key , KeyBytes );
51
- assert (entry .entry_type == BEGIN_ARRAY_TOKEN , "key does not describe an object" );
51
+ assert (entry .entry_type == END_ARRAY_TOKEN , "key does not describe an object" );
52
52
53
53
let mut r = self ;
54
- r .layer_id = entry .parent_index ;
54
+ r .layer_type_of_root = entry .parent_index ;
55
55
r .root_id = entry .id ;
56
- r .layer_context = ARRAY_LAYER ;
57
- r .layer_index_in_transcript = key_index ;
56
+ r .layer_type_of_root = ARRAY_LAYER ;
57
+ r .root_index_in_transcript = key_index ;
58
58
59
59
r
60
60
}
@@ -63,19 +63,19 @@ impl<let NumBytes: u32, let NumPackedFields: u16, let MaxNumTokens: u16, let Max
63
63
* @brief same as `get_array` for where the key length may be less than KeyBytes
64
64
**/
65
65
fn get_array_var <let KeyBytes : u16 >(self , key : [u8 ; KeyBytes ], key_length : u16 ) -> Option <Self > {
66
- assert (self .layer_context != ARRAY_LAYER , "cannot extract array elements via a key" );
66
+ assert (self .layer_type_of_root != ARRAY_LAYER , "cannot extract array elements via a key" );
67
67
let (exists , key_index ) = self .key_exists_impl (key , key_length );
68
- let entry : JSONEntry = self .packed_json_entries [key_index ].into ();
68
+ let entry : JSONEntry = self .json_entries_packed [key_index ].into ();
69
69
// TODO: ADD A layer_context VARIABLE INTO JSON WHICH DESCRIBES WHETHER WE ARE AN OBJECT, ARRAY OR SINGLE VALUE
70
70
assert (
71
- (entry .entry_type - BEGIN_ARRAY_TOKEN ) * exists as Field == 0 , "key does not describe an object"
71
+ (entry .entry_type - END_ARRAY_TOKEN ) * exists as Field == 0 , "key does not describe an object"
72
72
);
73
73
74
74
let mut r = self ;
75
- r .layer_id = entry .parent_index ;
75
+ r .layer_type_of_root = entry .parent_index ;
76
76
r .root_id = entry .id ;
77
- r .layer_context = ARRAY_LAYER ;
78
- r .layer_index_in_transcript = key_index ;
77
+ r .layer_type_of_root = ARRAY_LAYER ;
78
+ r .root_index_in_transcript = key_index ;
79
79
80
80
Option { _is_some : exists , _value : r }
81
81
}
@@ -84,16 +84,16 @@ impl<let NumBytes: u32, let NumPackedFields: u16, let MaxNumTokens: u16, let Max
84
84
* @brief same as `get_array_unchecked` for where the key length may be less than KeyBytes
85
85
**/
86
86
fn get_array_unchecked_var <let KeyBytes : u16 >(self , key : [u8 ; KeyBytes ], key_length : u16 ) -> Self {
87
- assert (self .layer_context != ARRAY_LAYER , "cannot extract array elements via a key" );
87
+ assert (self .layer_type_of_root != ARRAY_LAYER , "cannot extract array elements via a key" );
88
88
89
89
let (entry , key_index ) = self .get_json_entry_unchecked_with_key_index_var (key , key_length );
90
- assert (entry .entry_type == BEGIN_ARRAY_TOKEN , "key does not describe an object" );
90
+ assert (entry .entry_type == END_ARRAY_TOKEN , "key does not describe an object" );
91
91
92
92
let mut r = self ;
93
- r .layer_id = entry .parent_index ;
93
+ r .layer_type_of_root = entry .parent_index ;
94
94
r .root_id = entry .id ;
95
- r .layer_context = ARRAY_LAYER ;
96
- r .layer_index_in_transcript = key_index ;
95
+ r .layer_type_of_root = ARRAY_LAYER ;
96
+ r .root_index_in_transcript = key_index ;
97
97
98
98
r
99
99
}
@@ -103,22 +103,22 @@ impl<let NumBytes: u32, let NumPackedFields: u16, let MaxNumTokens: u16, let Max
103
103
* @description returns an Option<JSON> where, if the array exists, the JSON object will have the requested array as its root value
104
104
**/
105
105
fn get_array_from_array (self , array_index : Field ) -> Option <Self > {
106
- assert (self .layer_context == ARRAY_LAYER , "can only acceess array elements from array" );
106
+ assert (self .layer_type_of_root == ARRAY_LAYER , "can only acceess array elements from array" );
107
107
108
- let parent_entry : JSONEntry = self .packed_json_entries [self .layer_index_in_transcript ].into ();
108
+ let parent_entry : JSONEntry = self .json_entries_packed [self .root_index_in_transcript ].into ();
109
109
let valid = lt_field_16_bit (array_index , parent_entry .num_children );
110
110
let entry_index = (parent_entry .child_pointer + array_index ) * valid as Field ;
111
111
112
- let entry : JSONEntry = self .packed_json_entries [entry_index ].into ();
112
+ let entry : JSONEntry = self .json_entries_packed [entry_index ].into ();
113
113
assert (
114
- (entry .entry_type - BEGIN_ARRAY_TOKEN ) * valid as Field == 0 , "get_object_from_array: entry exists but is not an object!"
114
+ (entry .entry_type - END_ARRAY_TOKEN ) * valid as Field == 0 , "get_object_from_array: entry exists but is not an object!"
115
115
);
116
116
117
117
let mut r = self ;
118
- r .layer_id = entry .parent_index ;
118
+ r .layer_type_of_root = entry .parent_index ;
119
119
r .root_id = entry .id ;
120
- r .layer_context = ARRAY_LAYER ;
121
- r .layer_index_in_transcript = entry_index ;
120
+ r .layer_type_of_root = ARRAY_LAYER ;
121
+ r .root_index_in_transcript = entry_index ;
122
122
123
123
Option { _is_some : valid , _value : r }
124
124
}
@@ -128,40 +128,39 @@ impl<let NumBytes: u32, let NumPackedFields: u16, let MaxNumTokens: u16, let Max
128
128
* @description will revert if the array does not exist
129
129
**/
130
130
fn get_array_from_array_unchecked (self , array_index : Field ) -> Self {
131
- assert (self .layer_context == ARRAY_LAYER , "can only acceess array elements from array" );
131
+ assert (self .layer_type_of_root == ARRAY_LAYER , "can only acceess array elements from array" );
132
132
133
- let parent_entry : JSONEntry = self .packed_json_entries [self .layer_index_in_transcript ].into ();
133
+ let parent_entry : JSONEntry = self .json_entries_packed [self .root_index_in_transcript ].into ();
134
134
let valid = lt_field_16_bit (array_index , parent_entry .num_children );
135
135
assert (valid , "array overflow" );
136
136
let entry_index = (parent_entry .child_pointer + array_index );
137
-
138
- let entry : JSONEntry = self .packed_json_entries [entry_index ].into ();
137
+ let entry : JSONEntry = self .json_entries_packed [entry_index ].into ();
139
138
assert (
140
- entry .entry_type == BEGIN_ARRAY_TOKEN , "get_array_from_array_unchecked: entry exists but is not an array!"
139
+ entry .entry_type == END_ARRAY_TOKEN , "get_array_from_array_unchecked: entry exists but is not an array!"
141
140
);
142
141
143
142
let mut r = self ;
144
- r .layer_id = entry .parent_index ;
143
+ r .layer_type_of_root = entry .parent_index ;
145
144
r .root_id = entry .id ;
146
- r .layer_context = ARRAY_LAYER ;
147
- r .layer_index_in_transcript = entry_index ;
145
+ r .layer_type_of_root = ARRAY_LAYER ;
146
+ r .root_index_in_transcript = entry_index ;
148
147
r
149
148
}
150
149
151
150
/**
152
151
* @brief if the root is an array, map over the array values, applying `fn f` to each value
153
152
**/
154
153
fn map <U , let MaxElements : u32 , let MaxElementBytes : u32 >(self , f : fn (JSONValue <MaxElementBytes >) -> U ) -> [U ; MaxElements ] where U : std::default::Default {
155
- assert (self .layer_context == ARRAY_LAYER , "can only call map on an array" );
154
+ assert (self .layer_type_of_root == ARRAY_LAYER , "can only call map on an array" );
156
155
157
- let entry : JSONEntry = self .packed_json_entries [self .layer_index_in_transcript ].into ();
156
+ let entry : JSONEntry = self .json_entries_packed [self .root_index_in_transcript ].into ();
158
157
let num_children = entry .num_children ;
159
158
let mut r : [U ; MaxElements ] = [U ::default (); MaxElements ];
160
159
161
160
for i in 0 ..MaxElements {
162
161
let valid = lt_field_16_bit (i as Field , num_children );
163
162
let entry_index = (entry .child_pointer + i as Field ) * valid as Field ;
164
- let child_entry : JSONEntry = self .packed_json_entries [entry_index ].into ();
163
+ let child_entry : JSONEntry = self .json_entries_packed [entry_index ].into ();
165
164
let mut parsed_string : [u8 ; MaxElementBytes ] = [0 ; MaxElementBytes ];
166
165
for j in 0 ..MaxElementBytes {
167
166
let byte_valid = lt_field_16_bit (j as Field , child_entry .json_length );
@@ -187,12 +186,12 @@ impl<let NumBytes: u32, let NumPackedFields: u16, let MaxNumTokens: u16, let Max
187
186
fn test_array () {
188
187
let text = "{ \" foo\" : [ [1,2,3], [[3,4]], [[]], [], { \" bar\" : [\" b\" , \" a\" , \" z\" ]} ]}" ;
189
188
190
- let mut json : JSON <_ , 7 , 60 , 60 > = JSON ::parse_json (text );
189
+ let mut json : JSON <_ , 7 , 60 , 60 > = JSON ::parse_json_from_string (text );
191
190
192
191
let first = json .get_array_unchecked ("foo" .as_bytes ());
193
192
assert (first .get_length () == 5 );
194
193
195
- let A = first .get_array_from_array_unchecked (0 );
194
+ let A : JSON < 68 , 7 , 60 , 60 > = first .get_array_from_array_unchecked (0 );
196
195
assert (A .get_length () == 3 );
197
196
198
197
let B = first .get_array_from_array_unchecked (1 );
@@ -217,11 +216,6 @@ fn test_array() {
217
216
218
217
let E = first .get_object_from_array_unchecked (4 );
219
218
220
- let entry_maybe : JSONEntry = E .packed_json_entries [E .layer_index_in_transcript ].into ();
221
- println (f"entry = { entry_maybe} " );
222
- let child : JSONEntry = E .packed_json_entries [entry_maybe .child_pointer ].into ();
223
- println (f"target? = { child} " );
224
- println (f"{ E} " );
225
219
let E_A = E .get_array_unchecked ("bar" .as_bytes ());
226
220
assert (E_A .get_length () == 3 );
227
221
}
0 commit comments