15
15
import java .util .ArrayList ;
16
16
import java .util .Arrays ;
17
17
import java .util .HashMap ;
18
+ import java .util .LinkedHashMap ;
18
19
import java .util .List ;
19
20
import java .util .Map ;
20
21
import java .util .concurrent .ConcurrentHashMap ;
@@ -92,15 +93,18 @@ private Schema getMemberIfSame(Object o, byte[] bytes, int off, int len) {
92
93
private static final Map <Schema , Canonicalizer > CANONICALIZERS = new ConcurrentHashMap <>();
93
94
94
95
private final CborParser parser ;
96
+ private final CborSettings settings ;
95
97
private final byte [] payload ;
96
98
97
- CborDeserializer (byte [] payload ) {
99
+ CborDeserializer (byte [] payload , CborSettings settings ) {
98
100
this .parser = new CborParser (payload );
101
+ this .settings = settings ;
99
102
this .payload = payload ;
100
103
parser .advance ();
101
104
}
102
105
103
- CborDeserializer (ByteBuffer byteBuffer ) {
106
+ CborDeserializer (ByteBuffer byteBuffer , CborSettings settings ) {
107
+ this .settings = settings ;
104
108
if (byteBuffer .hasArray ()) {
105
109
byte [] payload = byteBuffer .array ();
106
110
this .payload = payload ;
@@ -248,12 +252,12 @@ private static float float16(int hbits) {
248
252
249
253
@ Override
250
254
public BigInteger readBigInteger (Schema schema ) {
251
- return null ;
255
+ throw new UnsupportedOperationException ( "BigInteger is not supported yet" ) ;
252
256
}
253
257
254
258
@ Override
255
259
public BigDecimal readBigDecimal (Schema schema ) {
256
- return null ;
260
+ throw new UnsupportedOperationException ( "BigDecimal is not supported yet" ) ;
257
261
}
258
262
259
263
@ Override
@@ -267,7 +271,54 @@ public String readString(Schema schema) {
267
271
268
272
@ Override
269
273
public Document readDocument () {
270
- throw new UnsupportedOperationException ("RPCv2 does not support Documents" );
274
+ var token = parser .currentToken ();
275
+ if (token == Token .FINISHED ) {
276
+ throw new SerializationException ("No CBOR value to read" );
277
+ }
278
+ return switch (token ) {
279
+ case Token .POS_INT , Token .NEG_INT -> Document .of (readLong (null ));
280
+ case Token .NULL -> null ;
281
+ case Token .TEXT_STRING -> Document .of (readString (null ));
282
+ case Token .BYTE_STRING -> Document .of (readBlob (null ));
283
+ case Token .TRUE -> Document .of (true );
284
+ case Token .FALSE -> Document .of (false );
285
+ case Token .EPOCH_INEG , Token .EPOCH_IPOS , Token .EPOCH_F -> Document .of (readTimestamp (null ));
286
+ case Token .FLOAT -> {
287
+ int pos = parser .getPosition ();
288
+ int len = parser .getItemLength ();
289
+ long fp = CborReadUtil .readLong (payload , token , pos , len );
290
+ // ordered by how likely it is we'll encounter each case
291
+ if (len == 8 ) { // double
292
+ yield Document .of (Double .longBitsToDouble (fp ));
293
+ } else if (len == 4 ) { // float
294
+ yield Document .of (Float .intBitsToFloat ((int ) fp ));
295
+ } else { // b == 2 - half-precision float
296
+ yield Document .of (float16 ((int ) fp ));
297
+ }
298
+ }
299
+ case Token .POS_BIGINT , Token .NEG_BIGINT -> Document .of (readBigInteger (null ));
300
+ case Token .START_ARRAY -> {
301
+ List <Document > values = new ArrayList <>();
302
+ for (token = parser .advance (); token != Token .END_ARRAY ; token = parser .advance ()) {
303
+ values .add (readDocument ());
304
+ }
305
+ yield Document .of (values );
306
+ }
307
+ case Token .START_OBJECT -> {
308
+ Map <String , Document > values = new LinkedHashMap <>();
309
+ for (token = parser .advance (); token != Token .END_OBJECT ; token = parser .advance ()) {
310
+ if (token != Token .KEY ) {
311
+ throw badType ("struct member" , token );
312
+ }
313
+
314
+ var key = CborReadUtil .readTextString (payload , parser .getPosition (), parser .getItemLength ());
315
+ parser .advance ();
316
+ values .put (key , readDocument ());
317
+ }
318
+ yield CborDocuments .of (values , settings );
319
+ }
320
+ default -> throw new SerializationException ("Unexpected token: " + Token .name (token ));
321
+ };
271
322
}
272
323
273
324
@ Override
0 commit comments