1
1
// SPDX-License-Identifier: Apache-2.0
2
2
3
- use crate :: tag:: TagAccess ;
3
+ use crate :: { simple_type :: SimpleTypeAccess , tag:: TagAccess } ;
4
4
5
5
use super :: { Error , Integer , Value } ;
6
6
7
7
use alloc:: { boxed:: Box , string:: String , vec:: Vec } ;
8
8
use core:: iter:: Peekable ;
9
9
10
- use ciborium_ll:: tag;
10
+ use ciborium_ll:: { simple , tag} ;
11
11
use serde:: de:: { self , Deserializer as _} ;
12
12
13
13
impl < ' a > From < Integer > for de:: Unexpected < ' a > {
@@ -36,6 +36,7 @@ impl<'a> From<&'a Value> for de::Unexpected<'a> {
36
36
Value :: Map ( ..) => Self :: Map ,
37
37
Value :: Null => Self :: Other ( "null" ) ,
38
38
Value :: Tag ( ..) => Self :: Other ( "tag" ) ,
39
+ Value :: Simple ( ..) => Self :: Other ( "simple" ) ,
39
40
}
40
41
}
41
42
}
@@ -141,9 +142,9 @@ impl<'de> serde::de::Visitor<'de> for Visitor {
141
142
fn visit_enum < A : de:: EnumAccess < ' de > > ( self , acc : A ) -> Result < Self :: Value , A :: Error > {
142
143
use serde:: de:: VariantAccess ;
143
144
144
- struct Inner ;
145
+ struct TagInner ;
145
146
146
- impl < ' de > serde:: de:: Visitor < ' de > for Inner {
147
+ impl < ' de > serde:: de:: Visitor < ' de > for TagInner {
147
148
type Value = Value ;
148
149
149
150
fn expecting ( & self , formatter : & mut core:: fmt:: Formatter < ' _ > ) -> core:: fmt:: Result {
@@ -162,9 +163,30 @@ impl<'de> serde::de::Visitor<'de> for Visitor {
162
163
}
163
164
}
164
165
166
+ struct SimpleTypeInner ;
167
+
168
+ impl < ' de > serde:: de:: Visitor < ' de > for SimpleTypeInner {
169
+ type Value = Value ;
170
+
171
+ fn expecting ( & self , formatter : & mut core:: fmt:: Formatter < ' _ > ) -> core:: fmt:: Result {
172
+ write ! ( formatter, "a valid CBOR item" )
173
+ }
174
+
175
+ #[ inline]
176
+ fn visit_seq < A : de:: SeqAccess < ' de > > ( self , mut acc : A ) -> Result < Self :: Value , A :: Error > {
177
+ let st= acc
178
+ . next_element :: < u8 > ( ) ?
179
+ . ok_or_else ( || de:: Error :: custom ( "expected simple type" ) ) ?;
180
+ Ok ( Value :: Simple ( st) )
181
+ }
182
+ }
183
+
165
184
let ( name, data) : ( String , _ ) = acc. variant ( ) ?;
166
- assert_eq ! ( "@@TAGGED@@" , name) ;
167
- data. tuple_variant ( 2 , Inner )
185
+ match name. as_str ( ) {
186
+ "@@TAGGED@@" => data. tuple_variant ( 2 , TagInner ) ,
187
+ "@@SIMPLETYPE@@" => data. tuple_variant ( 1 , SimpleTypeInner ) ,
188
+ _ => panic ! ( "Implementation error" )
189
+ }
168
190
}
169
191
}
170
192
@@ -218,6 +240,7 @@ impl<'a> Deserializer<&'a Value> {
218
240
. map ( |x| x ^ !0 )
219
241
. map_err ( |_| err ( ) )
220
242
. and_then ( |x| x. try_into ( ) . map_err ( |_| err ( ) ) ) ?,
243
+ Value :: Simple ( x) => i128:: from ( * x) . try_into ( ) . map_err ( |_| err ( ) ) ?,
221
244
_ => return Err ( de:: Error :: invalid_type ( self . 0 . into ( ) , & "(big)int" ) ) ,
222
245
} )
223
246
}
@@ -228,13 +251,22 @@ impl<'a, 'de> de::Deserializer<'de> for Deserializer<&'a Value> {
228
251
229
252
#[ inline]
230
253
fn deserialize_any < V : de:: Visitor < ' de > > ( self , visitor : V ) -> Result < V :: Value , Self :: Error > {
254
+ use serde:: ser:: Error as _;
231
255
match self . 0 {
232
256
Value :: Bytes ( x) => visitor. visit_bytes ( x) ,
233
257
Value :: Text ( x) => visitor. visit_str ( x) ,
234
258
Value :: Array ( x) => visitor. visit_seq ( Deserializer ( x. iter ( ) ) ) ,
235
259
Value :: Map ( x) => visitor. visit_map ( Deserializer ( x. iter ( ) . peekable ( ) ) ) ,
236
260
Value :: Bool ( x) => visitor. visit_bool ( * x) ,
237
261
Value :: Null => visitor. visit_none ( ) ,
262
+ Value :: Simple ( v @ simple:: UNDEFINED ) => {
263
+ visitor. visit_enum ( SimpleTypeAccess :: new ( self , * v) )
264
+ }
265
+ Value :: Simple ( 0 ..=31 ) => Err ( Self :: Error :: custom ( "Unsupported simple type" ) ) ,
266
+ Value :: Simple ( v) => {
267
+ let access = SimpleTypeAccess :: new ( self , * v) ;
268
+ visitor. visit_enum ( access)
269
+ } ,
238
270
239
271
Value :: Tag ( t, v) => {
240
272
let parent: Deserializer < & Value > = Deserializer ( v) ;
@@ -493,6 +525,18 @@ impl<'a, 'de> de::Deserializer<'de> for Deserializer<&'a Value> {
493
525
let parent: Deserializer < & Value > = Deserializer ( val) ;
494
526
let access = TagAccess :: new ( parent, tag) ;
495
527
return visitor. visit_enum ( access) ;
528
+ } else if name == "@@ST@@" {
529
+ use serde:: ser:: Error as _;
530
+ return match self . 0 {
531
+ Value :: Simple ( v @ simple:: UNDEFINED ) => {
532
+ visitor. visit_enum ( SimpleTypeAccess :: new ( Deserializer ( self . 0 ) , * v) )
533
+ }
534
+ Value :: Simple ( 0 ..=31 ) => return Err ( Error :: custom ( "Unsupported simple type" ) ) ,
535
+ Value :: Simple ( v) => {
536
+ visitor. visit_enum ( SimpleTypeAccess :: new ( Deserializer ( self . 0 ) , * v) )
537
+ }
538
+ _ => Err ( Error :: custom ( "Implementation error for simple type" ) ) ,
539
+ } ;
496
540
}
497
541
498
542
match self . 0 {
0 commit comments