1
1
use delegate:: delegate;
2
- use ion_rs:: { Decimal , Int , IonError , IonReader , IonType , Reader , StreamItem } ;
2
+ use ion_rs:: { Decimal , Int , IonError , IonReader , IonType , StreamItem , Symbol } ;
3
3
use once_cell:: sync:: Lazy ;
4
4
use partiql_value:: { Bag , DateTime , List , Tuple , Value } ;
5
5
use regex:: RegexSet ;
@@ -89,7 +89,10 @@ impl IonDecoderBuilder {
89
89
}
90
90
91
91
/// Create a decoder given the previously specified config and an ion [`Reader`].
92
- pub fn build ( self , reader : Reader ) -> Result < IonValueIter , IonDecodeError > {
92
+ pub fn build < ' a > (
93
+ self ,
94
+ reader : impl ' a + IonReader < Item = StreamItem , Symbol = Symbol > ,
95
+ ) -> Result < IonValueIter < ' a > , IonDecodeError > {
93
96
let decoder = SimpleIonValueDecoder { } ;
94
97
let inner: Box < dyn Iterator < Item = IonDecodeResult > > = match self . config . mode {
95
98
crate :: Encoding :: Ion => Box :: new ( IonValueIterInner { reader, decoder } ) ,
@@ -123,17 +126,19 @@ impl<'a> Iterator for IonValueIter<'a> {
123
126
}
124
127
}
125
128
126
- struct IonValueIterInner < ' a , D >
129
+ struct IonValueIterInner < D , R >
127
130
where
128
- D : IonValueDecoder ,
131
+ D : IonValueDecoder < R > ,
132
+ R : IonReader < Item = StreamItem , Symbol = Symbol > ,
129
133
{
130
- reader : Reader < ' a > ,
134
+ reader : R ,
131
135
decoder : D ,
132
136
}
133
137
134
- impl < ' a , P > Iterator for IonValueIterInner < ' a , P >
138
+ impl < D , R > Iterator for IonValueIterInner < D , R >
135
139
where
136
- P : IonValueDecoder ,
140
+ D : IonValueDecoder < R > ,
141
+ R : IonReader < Item = StreamItem , Symbol = Symbol > ,
137
142
{
138
143
type Item = IonDecodeResult ;
139
144
@@ -147,9 +152,12 @@ where
147
152
}
148
153
}
149
154
150
- trait IonValueDecoder {
155
+ trait IonValueDecoder < R >
156
+ where
157
+ R : IonReader < Item = StreamItem , Symbol = Symbol > ,
158
+ {
151
159
#[ inline]
152
- fn decode_value ( & self , reader : & mut Reader , typ : IonType ) -> IonDecodeResult {
160
+ fn decode_value ( & self , reader : & mut R , typ : IonType ) -> IonDecodeResult {
153
161
match typ {
154
162
IonType :: Null => self . decode_null ( reader) ,
155
163
IonType :: Bool => self . decode_bool ( reader) ,
@@ -167,19 +175,19 @@ trait IonValueDecoder {
167
175
}
168
176
}
169
177
170
- fn decode_null ( & self , reader : & mut Reader ) -> IonDecodeResult ;
171
- fn decode_bool ( & self , reader : & mut Reader ) -> IonDecodeResult ;
172
- fn decode_int ( & self , reader : & mut Reader ) -> IonDecodeResult ;
173
- fn decode_float ( & self , reader : & mut Reader ) -> IonDecodeResult ;
174
- fn decode_decimal ( & self , reader : & mut Reader ) -> IonDecodeResult ;
175
- fn decode_timestamp ( & self , reader : & mut Reader ) -> IonDecodeResult ;
176
- fn decode_symbol ( & self , reader : & mut Reader ) -> IonDecodeResult ;
177
- fn decode_string ( & self , reader : & mut Reader ) -> IonDecodeResult ;
178
- fn decode_clob ( & self , reader : & mut Reader ) -> IonDecodeResult ;
179
- fn decode_blob ( & self , reader : & mut Reader ) -> IonDecodeResult ;
180
- fn decode_list ( & self , reader : & mut Reader ) -> IonDecodeResult ;
181
- fn decode_sexp ( & self , reader : & mut Reader ) -> IonDecodeResult ;
182
- fn decode_struct ( & self , reader : & mut Reader ) -> IonDecodeResult ;
178
+ fn decode_null ( & self , reader : & mut R ) -> IonDecodeResult ;
179
+ fn decode_bool ( & self , reader : & mut R ) -> IonDecodeResult ;
180
+ fn decode_int ( & self , reader : & mut R ) -> IonDecodeResult ;
181
+ fn decode_float ( & self , reader : & mut R ) -> IonDecodeResult ;
182
+ fn decode_decimal ( & self , reader : & mut R ) -> IonDecodeResult ;
183
+ fn decode_timestamp ( & self , reader : & mut R ) -> IonDecodeResult ;
184
+ fn decode_symbol ( & self , reader : & mut R ) -> IonDecodeResult ;
185
+ fn decode_string ( & self , reader : & mut R ) -> IonDecodeResult ;
186
+ fn decode_clob ( & self , reader : & mut R ) -> IonDecodeResult ;
187
+ fn decode_blob ( & self , reader : & mut R ) -> IonDecodeResult ;
188
+ fn decode_list ( & self , reader : & mut R ) -> IonDecodeResult ;
189
+ fn decode_sexp ( & self , reader : & mut R ) -> IonDecodeResult ;
190
+ fn decode_struct ( & self , reader : & mut R ) -> IonDecodeResult ;
183
191
}
184
192
185
193
fn ion_decimal_to_decimal ( ion_dec : Decimal ) -> Result < rust_decimal:: Decimal , rust_decimal:: Error > {
@@ -192,38 +200,41 @@ fn ion_decimal_to_decimal(ion_dec: Decimal) -> Result<rust_decimal::Decimal, rus
192
200
193
201
struct SimpleIonValueDecoder { }
194
202
195
- impl IonValueDecoder for SimpleIonValueDecoder {
203
+ impl < R > IonValueDecoder < R > for SimpleIonValueDecoder
204
+ where
205
+ R : IonReader < Item = StreamItem , Symbol = Symbol > ,
206
+ {
196
207
#[ inline]
197
- fn decode_null ( & self , _: & mut Reader ) -> IonDecodeResult {
208
+ fn decode_null ( & self , _: & mut R ) -> IonDecodeResult {
198
209
Ok ( Value :: Null )
199
210
}
200
211
201
212
#[ inline]
202
- fn decode_bool ( & self , reader : & mut Reader ) -> IonDecodeResult {
213
+ fn decode_bool ( & self , reader : & mut R ) -> IonDecodeResult {
203
214
Ok ( Value :: Boolean ( reader. read_bool ( ) ?) )
204
215
}
205
216
206
217
#[ inline]
207
- fn decode_int ( & self , reader : & mut Reader ) -> IonDecodeResult {
218
+ fn decode_int ( & self , reader : & mut R ) -> IonDecodeResult {
208
219
match reader. read_int ( ) ? {
209
220
Int :: I64 ( i) => Ok ( Value :: Integer ( i) ) ,
210
221
Int :: BigInt ( _) => Err ( IonDecodeError :: UnsupportedType ( "bigint" ) ) ,
211
222
}
212
223
}
213
224
214
225
#[ inline]
215
- fn decode_float ( & self , reader : & mut Reader ) -> IonDecodeResult {
226
+ fn decode_float ( & self , reader : & mut R ) -> IonDecodeResult {
216
227
Ok ( Value :: Real ( reader. read_f64 ( ) ?. into ( ) ) )
217
228
}
218
229
219
230
#[ inline]
220
- fn decode_decimal ( & self , reader : & mut Reader ) -> IonDecodeResult {
231
+ fn decode_decimal ( & self , reader : & mut R ) -> IonDecodeResult {
221
232
let dec = ion_decimal_to_decimal ( reader. read_decimal ( ) ?) ;
222
233
Ok ( Value :: Decimal ( dec?) )
223
234
}
224
235
225
236
#[ inline]
226
- fn decode_timestamp ( & self , reader : & mut Reader ) -> IonDecodeResult {
237
+ fn decode_timestamp ( & self , reader : & mut R ) -> IonDecodeResult {
227
238
let ts = reader. read_timestamp ( ) ?;
228
239
let offset = ts. offset ( ) ;
229
240
let datetime = DateTime :: from_ymdhms_nano_offset_minutes (
@@ -242,47 +253,50 @@ impl IonValueDecoder for SimpleIonValueDecoder {
242
253
}
243
254
244
255
#[ inline]
245
- fn decode_symbol ( & self , reader : & mut Reader ) -> IonDecodeResult {
256
+ fn decode_symbol ( & self , reader : & mut R ) -> IonDecodeResult {
246
257
Ok ( Value :: String ( Box :: new (
247
258
reader. read_symbol ( ) ?. text_or_error ( ) ?. to_string ( ) ,
248
259
) ) )
249
260
}
250
261
251
262
#[ inline]
252
- fn decode_string ( & self , reader : & mut Reader ) -> IonDecodeResult {
263
+ fn decode_string ( & self , reader : & mut R ) -> IonDecodeResult {
253
264
Ok ( Value :: String ( Box :: new (
254
265
reader. read_string ( ) ?. text ( ) . to_string ( ) ,
255
266
) ) )
256
267
}
257
268
258
269
#[ inline]
259
- fn decode_clob ( & self , reader : & mut Reader ) -> IonDecodeResult {
270
+ fn decode_clob ( & self , reader : & mut R ) -> IonDecodeResult {
260
271
Ok ( Value :: Blob ( Box :: new ( reader. read_clob ( ) ?. as_slice ( ) . into ( ) ) ) )
261
272
}
262
273
263
274
#[ inline]
264
- fn decode_blob ( & self , reader : & mut Reader ) -> IonDecodeResult {
275
+ fn decode_blob ( & self , reader : & mut R ) -> IonDecodeResult {
265
276
Ok ( Value :: Blob ( Box :: new ( reader. read_blob ( ) ?. as_slice ( ) . into ( ) ) ) )
266
277
}
267
278
268
279
#[ inline]
269
- fn decode_list ( & self , reader : & mut Reader ) -> IonDecodeResult {
280
+ fn decode_list ( & self , reader : & mut R ) -> IonDecodeResult {
270
281
decode_list ( self , reader)
271
282
}
272
283
273
284
#[ inline]
274
- fn decode_sexp ( & self , _: & mut Reader ) -> IonDecodeResult {
285
+ fn decode_sexp ( & self , _: & mut R ) -> IonDecodeResult {
275
286
Err ( IonDecodeError :: UnsupportedType ( "sexp" ) )
276
287
}
277
288
278
289
#[ inline]
279
- fn decode_struct ( & self , reader : & mut Reader ) -> IonDecodeResult {
290
+ fn decode_struct ( & self , reader : & mut R ) -> IonDecodeResult {
280
291
decode_struct ( self , reader)
281
292
}
282
293
}
283
294
284
295
#[ inline]
285
- fn decode_list ( decoder : & impl IonValueDecoder , reader : & mut Reader ) -> IonDecodeResult {
296
+ fn decode_list < R > ( decoder : & impl IonValueDecoder < R > , reader : & mut R ) -> IonDecodeResult
297
+ where
298
+ R : IonReader < Item = StreamItem , Symbol = Symbol > ,
299
+ {
286
300
reader. step_in ( ) ?;
287
301
let mut values = vec ! [ ] ;
288
302
' values: loop {
@@ -299,18 +313,21 @@ fn decode_list(decoder: &impl IonValueDecoder, reader: &mut Reader) -> IonDecode
299
313
}
300
314
301
315
#[ inline]
302
- fn decode_struct ( decoder : & impl IonValueDecoder , reader : & mut Reader ) -> IonDecodeResult {
316
+ fn decode_struct < R > ( decoder : & impl IonValueDecoder < R > , reader : & mut R ) -> IonDecodeResult
317
+ where
318
+ R : IonReader < Item = StreamItem , Symbol = Symbol > ,
319
+ {
303
320
let mut tuple = Tuple :: new ( ) ;
304
321
reader. step_in ( ) ?;
305
- loop {
322
+ ' kv : loop {
306
323
let item = reader. next ( ) ?;
307
324
let ( key, value) = match item {
308
325
StreamItem :: Value ( typ) => {
309
326
let field_name = reader. field_name ( ) ?;
310
327
( field_name, decoder. decode_value ( reader, typ) ?)
311
328
}
312
329
StreamItem :: Null ( _) => ( reader. field_name ( ) ?, decoder. decode_null ( reader) ?) ,
313
- StreamItem :: Nothing => break ,
330
+ StreamItem :: Nothing => break ' kv ,
314
331
} ;
315
332
tuple. insert ( key. text_or_error ( ) ?, value) ;
316
333
}
@@ -323,7 +340,10 @@ struct PartiqlEncodedIonValueDecoder {
323
340
}
324
341
325
342
#[ inline]
326
- fn has_annotation ( reader : & Reader , annot : & str ) -> bool {
343
+ fn has_annotation (
344
+ reader : & impl IonReader < Item = StreamItem , Symbol = Symbol > ,
345
+ annot : & str ,
346
+ ) -> bool {
327
347
reader
328
348
. annotations ( )
329
349
. any ( |a| a. map_or ( false , |a| a == annot) )
@@ -333,7 +353,10 @@ static TIME_PARTS_PATTERN_SET: Lazy<RegexSet> =
333
353
Lazy :: new ( || RegexSet :: new ( RE_SET_TIME_PARTS ) . unwrap ( ) ) ;
334
354
335
355
impl PartiqlEncodedIonValueDecoder {
336
- fn decode_date ( & self , reader : & mut Reader ) -> IonDecodeResult {
356
+ fn decode_date < R > ( & self , reader : & mut R ) -> IonDecodeResult
357
+ where
358
+ R : IonReader < Item = StreamItem , Symbol = Symbol > ,
359
+ {
337
360
let ts = reader. read_timestamp ( ) ?;
338
361
let datetime = DateTime :: from_ymd (
339
362
ts. year ( ) ,
@@ -345,12 +368,18 @@ impl PartiqlEncodedIonValueDecoder {
345
368
Ok ( datetime. into ( ) )
346
369
}
347
370
348
- fn decode_time ( & self , reader : & mut Reader ) -> IonDecodeResult {
349
- fn expect_u8 (
350
- reader : & mut Reader ,
371
+ fn decode_time < R > ( & self , reader : & mut R ) -> IonDecodeResult
372
+ where
373
+ R : IonReader < Item = StreamItem , Symbol = Symbol > ,
374
+ {
375
+ fn expect_u8 < R > (
376
+ reader : & mut R ,
351
377
typ : Option < IonType > ,
352
378
unit : & ' static str ,
353
- ) -> Result < u8 , IonDecodeError > {
379
+ ) -> Result < u8 , IonDecodeError >
380
+ where
381
+ R : IonReader < Item = StreamItem , Symbol = Symbol > ,
382
+ {
354
383
match typ {
355
384
Some ( IonType :: Int ) => match reader. read_int ( ) ? {
356
385
Int :: I64 ( i) => Ok ( i as u8 ) , // TODO check range
@@ -363,11 +392,14 @@ impl PartiqlEncodedIonValueDecoder {
363
392
) ) ) ,
364
393
}
365
394
}
366
- fn maybe_i8 (
367
- reader : & mut Reader ,
395
+ fn maybe_i8 < R > (
396
+ reader : & mut R ,
368
397
typ : Option < IonType > ,
369
398
unit : & ' static str ,
370
- ) -> Result < Option < i8 > , IonDecodeError > {
399
+ ) -> Result < Option < i8 > , IonDecodeError >
400
+ where
401
+ R : IonReader < Item = StreamItem , Symbol = Symbol > ,
402
+ {
371
403
match typ {
372
404
Some ( IonType :: Int ) => match reader. read_int ( ) ? {
373
405
Int :: I64 ( i) => Ok ( Some ( i as i8 ) ) , // TODO check range
@@ -382,11 +414,14 @@ impl PartiqlEncodedIonValueDecoder {
382
414
) ) ) ,
383
415
}
384
416
}
385
- fn expect_f64 (
386
- reader : & mut Reader ,
417
+ fn expect_f64 < R > (
418
+ reader : & mut R ,
387
419
typ : Option < IonType > ,
388
420
unit : & ' static str ,
389
- ) -> Result < f64 , IonDecodeError > {
421
+ ) -> Result < f64 , IonDecodeError >
422
+ where
423
+ R : IonReader < Item = StreamItem , Symbol = Symbol > ,
424
+ {
390
425
match typ {
391
426
Some ( IonType :: Decimal ) => {
392
427
let dec = ion_decimal_to_decimal ( reader. read_decimal ( ) ?) ;
@@ -457,9 +492,12 @@ impl PartiqlEncodedIonValueDecoder {
457
492
}
458
493
}
459
494
460
- impl IonValueDecoder for PartiqlEncodedIonValueDecoder {
495
+ impl < R > IonValueDecoder < R > for PartiqlEncodedIonValueDecoder
496
+ where
497
+ R : IonReader < Item = StreamItem , Symbol = Symbol > ,
498
+ {
461
499
#[ inline]
462
- fn decode_null ( & self , reader : & mut Reader ) -> IonDecodeResult {
500
+ fn decode_null ( & self , reader : & mut R ) -> IonDecodeResult {
463
501
if has_annotation ( reader, MISSING_ANNOT ) {
464
502
Ok ( Value :: Missing )
465
503
} else {
@@ -468,7 +506,7 @@ impl IonValueDecoder for PartiqlEncodedIonValueDecoder {
468
506
}
469
507
470
508
#[ inline]
471
- fn decode_timestamp ( & self , reader : & mut Reader ) -> IonDecodeResult {
509
+ fn decode_timestamp ( & self , reader : & mut R ) -> IonDecodeResult {
472
510
if has_annotation ( reader, DATE_ANNOT ) {
473
511
self . decode_date ( reader)
474
512
} else {
@@ -477,7 +515,7 @@ impl IonValueDecoder for PartiqlEncodedIonValueDecoder {
477
515
}
478
516
479
517
#[ inline]
480
- fn decode_list ( & self , reader : & mut Reader ) -> IonDecodeResult {
518
+ fn decode_list ( & self , reader : & mut R ) -> IonDecodeResult {
481
519
let is_bag = has_annotation ( reader, BAG_ANNOT ) ;
482
520
let list = decode_list ( self , reader) ;
483
521
if is_bag {
@@ -488,7 +526,7 @@ impl IonValueDecoder for PartiqlEncodedIonValueDecoder {
488
526
}
489
527
490
528
#[ inline]
491
- fn decode_struct ( & self , reader : & mut Reader ) -> IonDecodeResult {
529
+ fn decode_struct ( & self , reader : & mut R ) -> IonDecodeResult {
492
530
if has_annotation ( reader, TIME_ANNOT ) {
493
531
self . decode_time ( reader)
494
532
} else {
@@ -498,15 +536,15 @@ impl IonValueDecoder for PartiqlEncodedIonValueDecoder {
498
536
499
537
delegate ! {
500
538
to self . inner {
501
- fn decode_bool( & self , reader: & mut Reader ) -> IonDecodeResult ;
502
- fn decode_int( & self , reader: & mut Reader ) -> IonDecodeResult ;
503
- fn decode_float( & self , reader: & mut Reader ) -> IonDecodeResult ;
504
- fn decode_decimal( & self , reader: & mut Reader ) -> IonDecodeResult ;
505
- fn decode_symbol( & self , reader: & mut Reader ) -> IonDecodeResult ;
506
- fn decode_string( & self , reader: & mut Reader ) -> IonDecodeResult ;
507
- fn decode_clob( & self , reader: & mut Reader ) -> IonDecodeResult ;
508
- fn decode_blob( & self , reader: & mut Reader ) -> IonDecodeResult ;
509
- fn decode_sexp( & self , reader: & mut Reader ) -> IonDecodeResult ;
539
+ fn decode_bool( & self , reader: & mut R ) -> IonDecodeResult ;
540
+ fn decode_int( & self , reader: & mut R ) -> IonDecodeResult ;
541
+ fn decode_float( & self , reader: & mut R ) -> IonDecodeResult ;
542
+ fn decode_decimal( & self , reader: & mut R ) -> IonDecodeResult ;
543
+ fn decode_symbol( & self , reader: & mut R ) -> IonDecodeResult ;
544
+ fn decode_string( & self , reader: & mut R ) -> IonDecodeResult ;
545
+ fn decode_clob( & self , reader: & mut R ) -> IonDecodeResult ;
546
+ fn decode_blob( & self , reader: & mut R ) -> IonDecodeResult ;
547
+ fn decode_sexp( & self , reader: & mut R ) -> IonDecodeResult ;
510
548
}
511
549
}
512
550
}
0 commit comments