@@ -125,6 +125,10 @@ pub const Value = struct {
125
125
else = > @compileError ("unsupported type: " ++ @typeName (T ) ++ ". expecting pointer type." ),
126
126
}
127
127
}
128
+
129
+ pub fn get_type (val : * Value ) ! ValueType {
130
+ return val .iter .get_type ();
131
+ }
128
132
};
129
133
130
134
pub const Field = struct {
@@ -166,6 +170,7 @@ pub const Object = struct {
166
170
pub fn iterator (o : Object ) ObjectIterator {
167
171
return ObjectIterator .init (o .iter );
168
172
}
173
+ // TODO: move these to ValueIterator
169
174
fn start_root (iter : * ValueIterator ) ! Object {
170
175
_ = try iter .start_root_object ();
171
176
return Object { .iter = iter .* };
@@ -177,6 +182,9 @@ pub const Object = struct {
177
182
fn resume_ (iter : * ValueIterator ) Object {
178
183
return Object { .iter = iter .* };
179
184
}
185
+ pub fn resume_value (o : Object ) Value {
186
+ return Value { .iter = o .iter };
187
+ }
180
188
181
189
pub fn find_field (o : * Object , key : []const u8 ) ! Value {
182
190
return if (try o .iter .find_field_raw (key ))
@@ -253,9 +261,6 @@ const ArrayIterator = struct {
253
261
}
254
262
return null ;
255
263
}
256
- pub fn get_int (ai : * ArrayIterator , comptime T : type ) ! T {
257
- return ai .iter .get_int (T );
258
- }
259
264
};
260
265
const Array = struct {
261
266
iter : ValueIterator ,
@@ -355,24 +360,25 @@ const TokenIterator = struct {
355
360
}
356
361
};
357
362
pub const Iterator = struct {
363
+ // TODO make this a pointer or make TokenIterator.read_buf a pointer
358
364
token : TokenIterator ,
359
365
parser : * Parser ,
360
366
err : Error ! void = {},
361
367
depth : u32 ,
362
368
log : Logger = .{ .depth = 0 },
363
369
364
370
pub fn init (parser : * Parser , src : std.io.StreamSource ) Iterator {
365
- return . {
371
+ return Iterator {
366
372
.token = .{ .src = src , .index = parser .structural_indices ().ptr , .buf_start_pos = 0 },
367
373
.parser = parser ,
368
374
.depth = 1 ,
369
375
};
370
376
}
371
377
372
- pub fn advance (iter : * Iterator , len : u16 ) ! [* ]const u8 {
378
+ pub fn advance (iter : * Iterator , peek_len : u16 ) ! [* ]const u8 {
373
379
defer iter .token .index += 1 ;
374
380
// print("advance '{s}'\n", .{(try iter.token.peek(iter.token.index, len))[0..len]});
375
- return iter .token .peek (iter .token .index , len );
381
+ return iter .token .peek (iter .token .index , peek_len );
376
382
}
377
383
pub fn peek (iter : * Iterator , index : [* ]const u32 , len : u16 ) ! [* ]const u8 {
378
384
return iter .token .peek (index , len );
@@ -529,9 +535,13 @@ pub const Iterator = struct {
529
535
iter .log .start (iter ); // We start again
530
536
iter .depth = 1 ;
531
537
}
538
+
539
+ fn at_eof (iter : Iterator ) bool {
540
+ return iter .token .index == iter .last_document_position ();
541
+ }
532
542
};
533
543
534
- const ValueIterator = struct {
544
+ pub const ValueIterator = struct {
535
545
iter : Iterator , // this needs to be a value, not a pointer
536
546
depth : u32 ,
537
547
start_position : [* ]const u32 ,
@@ -1124,14 +1134,13 @@ const ValueIterator = struct {
1124
1134
1125
1135
pub fn get_type (vi : * ValueIterator ) ! ValueType {
1126
1136
const start = try vi .peek_start (1 );
1127
- // println("get_type() start '{c}'", .{start[0]});
1128
1137
return switch (start [0 ]) {
1129
1138
'{' = > .object ,
1130
1139
'[' = > .array ,
1131
1140
'"' = > .string ,
1132
1141
'n' = > .nul ,
1133
1142
't' , 'f' = > .bool ,
1134
- '-' , '0' , '9' = > .number ,
1143
+ '-' , '0' ... '9' = > .number ,
1135
1144
else = > error .TAPE_ERROR ,
1136
1145
};
1137
1146
}
@@ -1186,12 +1195,12 @@ pub const Document = struct {
1186
1195
return doc .resume_value_iterator ().at_key (key );
1187
1196
}
1188
1197
pub fn get_object (doc : * Document ) ! Object {
1189
- var value = doc .get_root_value_iterator ();
1190
- return try Object .start_root (& value );
1198
+ var val = doc .get_root_value_iterator ();
1199
+ return try Object .start_root (& val );
1191
1200
}
1192
1201
pub fn get_array (doc : * Document ) ! Array {
1193
- var value = doc .get_root_value_iterator ();
1194
- return Array .start_root (& value );
1202
+ var val = doc .get_root_value_iterator ();
1203
+ return Array .start_root (& val );
1195
1204
}
1196
1205
fn resume_value (doc : * Document ) Value {
1197
1206
return Value { .iter = doc .resume_value_iterator () };
@@ -1237,7 +1246,10 @@ pub const Document = struct {
1237
1246
};
1238
1247
}
1239
1248
pub fn get (doc : * Document , out : anytype ) ! void {
1240
- return (Value { .iter = doc .get_root_value_iterator () }).get (out );
1249
+ return doc .value ().get (out );
1250
+ }
1251
+ pub fn value (doc : * Document ) Value {
1252
+ return Value { .iter = doc .get_root_value_iterator () };
1241
1253
}
1242
1254
};
1243
1255
@@ -1297,9 +1309,8 @@ pub const Parser = struct {
1297
1309
1298
1310
pub fn iterate (p : * Parser ) ! Document {
1299
1311
try p .stage1 ();
1300
- return Document {
1301
- .iter = Iterator .init (p , p .src .* ),
1302
- };
1312
+ p .iter = Iterator .init (p , p .src .* );
1313
+ return Document { .iter = p .iter };
1303
1314
}
1304
1315
1305
1316
inline fn structural_indices (parser : Parser ) []u32 {
0 commit comments