1 // SPDX-License-Identifier: Apache-2.0 2 3 use super::{Error, Integer, Value}; 4 5 use alloc::{boxed::Box, string::String, vec::Vec}; 6 use core::iter::Peekable; 7 8 use ciborium_ll::tag; 9 use serde::de::{self, Deserializer as _}; 10 11 impl<'a> From<Integer> for de::Unexpected<'a> { 12 #[inline] from(value: Integer) -> Self13 fn from(value: Integer) -> Self { 14 u64::try_from(value) 15 .map(de::Unexpected::Unsigned) 16 .unwrap_or_else(|_| { 17 i64::try_from(value) 18 .map(de::Unexpected::Signed) 19 .unwrap_or_else(|_| de::Unexpected::Other("large integer")) 20 }) 21 } 22 } 23 24 impl<'a> From<&'a Value> for de::Unexpected<'a> { 25 #[inline] from(value: &'a Value) -> Self26 fn from(value: &'a Value) -> Self { 27 match value { 28 Value::Bool(x) => Self::Bool(*x), 29 Value::Integer(x) => Self::from(*x), 30 Value::Float(x) => Self::Float(*x), 31 Value::Bytes(x) => Self::Bytes(x), 32 Value::Text(x) => Self::Str(x), 33 Value::Array(..) => Self::Seq, 34 Value::Map(..) => Self::Map, 35 Value::Null => Self::Other("null"), 36 Value::Tag(..) => Self::Other("tag"), 37 } 38 } 39 } 40 41 macro_rules! mkvisit { 42 ($($f:ident($v:ty)),+ $(,)?) => { 43 $( 44 #[inline] 45 fn $f<E: de::Error>(self, v: $v) -> Result<Self::Value, E> { 46 Ok(v.into()) 47 } 48 )+ 49 }; 50 } 51 52 struct Visitor; 53 54 impl<'de> serde::de::Visitor<'de> for Visitor { 55 type Value = Value; 56 expecting(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result57 fn expecting(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { 58 write!(formatter, "a valid CBOR item") 59 } 60 61 mkvisit! { 62 visit_bool(bool), 63 visit_f32(f32), 64 visit_f64(f64), 65 66 visit_i8(i8), 67 visit_i16(i16), 68 visit_i32(i32), 69 visit_i64(i64), 70 visit_i128(i128), 71 72 visit_u8(u8), 73 visit_u16(u16), 74 visit_u32(u32), 75 visit_u64(u64), 76 visit_u128(u128), 77 78 visit_char(char), 79 visit_str(&str), 80 visit_borrowed_str(&'de str), 81 visit_string(String), 82 83 visit_bytes(&[u8]), 84 visit_borrowed_bytes(&'de [u8]), 85 visit_byte_buf(Vec<u8>), 86 } 87 88 #[inline] visit_none<E: de::Error>(self) -> Result<Self::Value, E>89 fn visit_none<E: de::Error>(self) -> Result<Self::Value, E> { 90 Ok(Value::Null) 91 } 92 93 #[inline] visit_some<D: de::Deserializer<'de>>( self, deserializer: D, ) -> Result<Self::Value, D::Error>94 fn visit_some<D: de::Deserializer<'de>>( 95 self, 96 deserializer: D, 97 ) -> Result<Self::Value, D::Error> { 98 deserializer.deserialize_any(self) 99 } 100 101 #[inline] visit_unit<E: de::Error>(self) -> Result<Self::Value, E>102 fn visit_unit<E: de::Error>(self) -> Result<Self::Value, E> { 103 Ok(Value::Null) 104 } 105 106 #[inline] visit_newtype_struct<D: de::Deserializer<'de>>( self, deserializer: D, ) -> Result<Self::Value, D::Error>107 fn visit_newtype_struct<D: de::Deserializer<'de>>( 108 self, 109 deserializer: D, 110 ) -> Result<Self::Value, D::Error> { 111 deserializer.deserialize_any(self) 112 } 113 114 #[inline] visit_seq<A: de::SeqAccess<'de>>(self, mut acc: A) -> Result<Self::Value, A::Error>115 fn visit_seq<A: de::SeqAccess<'de>>(self, mut acc: A) -> Result<Self::Value, A::Error> { 116 let mut seq = Vec::new(); 117 118 while let Some(elem) = acc.next_element()? { 119 seq.push(elem); 120 } 121 122 Ok(Value::Array(seq)) 123 } 124 125 #[inline] visit_map<A: de::MapAccess<'de>>(self, mut acc: A) -> Result<Self::Value, A::Error>126 fn visit_map<A: de::MapAccess<'de>>(self, mut acc: A) -> Result<Self::Value, A::Error> { 127 let mut map = Vec::<(Value, Value)>::new(); 128 129 while let Some(kv) = acc.next_entry()? { 130 map.push(kv); 131 } 132 133 Ok(Value::Map(map)) 134 } 135 136 #[inline] visit_enum<A: de::EnumAccess<'de>>(self, acc: A) -> Result<Self::Value, A::Error>137 fn visit_enum<A: de::EnumAccess<'de>>(self, acc: A) -> Result<Self::Value, A::Error> { 138 use serde::de::VariantAccess; 139 140 struct Inner; 141 142 impl<'de> serde::de::Visitor<'de> for Inner { 143 type Value = Value; 144 145 fn expecting(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { 146 write!(formatter, "a valid CBOR item") 147 } 148 149 #[inline] 150 fn visit_seq<A: de::SeqAccess<'de>>(self, mut acc: A) -> Result<Self::Value, A::Error> { 151 let tag: u64 = acc 152 .next_element()? 153 .ok_or_else(|| de::Error::custom("expected tag"))?; 154 let val = acc 155 .next_element()? 156 .ok_or_else(|| de::Error::custom("expected val"))?; 157 Ok(Value::Tag(tag, Box::new(val))) 158 } 159 } 160 161 let (name, data): (String, _) = acc.variant()?; 162 assert_eq!("@@TAGGED@@", name); 163 data.tuple_variant(2, Inner) 164 } 165 } 166 167 impl<'de> de::Deserialize<'de> for Value { 168 #[inline] deserialize<D: de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error>169 fn deserialize<D: de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> { 170 deserializer.deserialize_any(Visitor) 171 } 172 } 173 174 struct Deserializer<T>(T); 175 176 impl<'a> Deserializer<&'a Value> { integer<N>(&self, kind: &'static str) -> Result<N, Error> where N: TryFrom<u128>, N: TryFrom<i128>,177 fn integer<N>(&self, kind: &'static str) -> Result<N, Error> 178 where 179 N: TryFrom<u128>, 180 N: TryFrom<i128>, 181 { 182 fn raw(value: &Value) -> Result<u128, Error> { 183 let mut buffer = 0u128.to_ne_bytes(); 184 let length = buffer.len(); 185 186 let bytes = match value { 187 Value::Bytes(bytes) => { 188 // Skip leading zeros... 189 let mut bytes: &[u8] = bytes.as_ref(); 190 while bytes.len() > buffer.len() && bytes[0] == 0 { 191 bytes = &bytes[1..]; 192 } 193 194 if bytes.len() > buffer.len() { 195 return Err(de::Error::custom("bigint too large")); 196 } 197 198 bytes 199 } 200 201 _ => return Err(de::Error::invalid_type(value.into(), &"bytes")), 202 }; 203 204 buffer[length - bytes.len()..].copy_from_slice(bytes); 205 Ok(u128::from_be_bytes(buffer)) 206 } 207 208 let err = || de::Error::invalid_type(self.0.into(), &kind); 209 210 Ok(match self.0 { 211 Value::Integer(x) => i128::from(*x).try_into().map_err(|_| err())?, 212 Value::Tag(t, v) if *t == tag::BIGPOS => raw(v)?.try_into().map_err(|_| err())?, 213 Value::Tag(t, v) if *t == tag::BIGNEG => i128::try_from(raw(v)?) 214 .map(|x| x ^ !0) 215 .map_err(|_| err()) 216 .and_then(|x| x.try_into().map_err(|_| err()))?, 217 _ => return Err(de::Error::invalid_type(self.0.into(), &"(big)int")), 218 }) 219 } 220 } 221 222 impl<'a, 'de> de::Deserializer<'de> for Deserializer<&'a Value> { 223 type Error = Error; 224 225 #[inline] deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>226 fn deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 227 match self.0 { 228 Value::Bytes(x) => visitor.visit_bytes(x), 229 Value::Text(x) => visitor.visit_str(x), 230 Value::Array(x) => visitor.visit_seq(Deserializer(x.iter())), 231 Value::Map(x) => visitor.visit_map(Deserializer(x.iter().peekable())), 232 Value::Bool(x) => visitor.visit_bool(*x), 233 Value::Null => visitor.visit_none(), 234 235 Value::Tag(t, v) => { 236 let parent: Deserializer<&Value> = Deserializer(v); 237 let access = crate::tag::TagAccess::new(parent, Some(*t)); 238 visitor.visit_enum(access) 239 } 240 241 Value::Integer(x) => { 242 if let Ok(x) = u64::try_from(*x) { 243 visitor.visit_u64(x) 244 } else if let Ok(x) = i64::try_from(*x) { 245 visitor.visit_i64(x) 246 } else if let Ok(x) = i128::try_from(*x) { 247 visitor.visit_i128(x) 248 } else { 249 unreachable!() 250 } 251 } 252 253 Value::Float(x) => visitor.visit_f64(*x), 254 } 255 } 256 257 #[inline] deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>258 fn deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 259 let mut value = self.0; 260 while let Value::Tag(.., v) = value { 261 value = v; 262 } 263 264 match value { 265 Value::Bool(x) => visitor.visit_bool(*x), 266 _ => Err(de::Error::invalid_type(value.into(), &"bool")), 267 } 268 } 269 270 #[inline] deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>271 fn deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 272 self.deserialize_f64(visitor) 273 } 274 275 #[inline] deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>276 fn deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 277 let mut value = self.0; 278 while let Value::Tag(.., v) = value { 279 value = v; 280 } 281 282 match value { 283 Value::Float(x) => visitor.visit_f64(*x), 284 _ => Err(de::Error::invalid_type(value.into(), &"f64")), 285 } 286 } 287 deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>288 fn deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 289 visitor.visit_i8(self.integer("i8")?) 290 } 291 deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>292 fn deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 293 visitor.visit_i16(self.integer("i16")?) 294 } 295 deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>296 fn deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 297 visitor.visit_i32(self.integer("i32")?) 298 } 299 deserialize_i64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>300 fn deserialize_i64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 301 visitor.visit_i64(self.integer("i64")?) 302 } 303 deserialize_i128<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>304 fn deserialize_i128<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 305 visitor.visit_i128(self.integer("i128")?) 306 } 307 deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>308 fn deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 309 visitor.visit_u8(self.integer("u8")?) 310 } 311 deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>312 fn deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 313 visitor.visit_u16(self.integer("u16")?) 314 } 315 deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>316 fn deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 317 visitor.visit_u32(self.integer("u32")?) 318 } 319 deserialize_u64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>320 fn deserialize_u64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 321 visitor.visit_u64(self.integer("u64")?) 322 } 323 deserialize_u128<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>324 fn deserialize_u128<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 325 visitor.visit_u128(self.integer("u128")?) 326 } 327 deserialize_char<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>328 fn deserialize_char<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 329 let mut value = self.0; 330 while let Value::Tag(.., v) = value { 331 value = v; 332 } 333 334 match value { 335 Value::Text(x) => match x.chars().count() { 336 1 => visitor.visit_char(x.chars().next().unwrap()), 337 _ => Err(de::Error::invalid_type(value.into(), &"char")), 338 }, 339 340 _ => Err(de::Error::invalid_type(value.into(), &"char")), 341 } 342 } 343 deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>344 fn deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 345 let mut value = self.0; 346 while let Value::Tag(.., v) = value { 347 value = v; 348 } 349 350 match value { 351 Value::Text(x) => visitor.visit_str(x), 352 _ => Err(de::Error::invalid_type(value.into(), &"str")), 353 } 354 } 355 deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>356 fn deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 357 self.deserialize_str(visitor) 358 } 359 deserialize_bytes<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>360 fn deserialize_bytes<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 361 let mut value = self.0; 362 while let Value::Tag(.., v) = value { 363 value = v; 364 } 365 366 match value { 367 Value::Bytes(x) => visitor.visit_bytes(x), 368 _ => Err(de::Error::invalid_type(value.into(), &"bytes")), 369 } 370 } 371 deserialize_byte_buf<V: de::Visitor<'de>>( self, visitor: V, ) -> Result<V::Value, Self::Error>372 fn deserialize_byte_buf<V: de::Visitor<'de>>( 373 self, 374 visitor: V, 375 ) -> Result<V::Value, Self::Error> { 376 self.deserialize_bytes(visitor) 377 } 378 deserialize_seq<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>379 fn deserialize_seq<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 380 let mut value = self.0; 381 while let Value::Tag(.., v) = value { 382 value = v; 383 } 384 385 match value { 386 Value::Array(x) => visitor.visit_seq(Deserializer(x.iter())), 387 _ => Err(de::Error::invalid_type(value.into(), &"array")), 388 } 389 } 390 deserialize_map<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>391 fn deserialize_map<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 392 let mut value = self.0; 393 while let Value::Tag(.., v) = value { 394 value = v; 395 } 396 397 match value { 398 Value::Map(x) => visitor.visit_map(Deserializer(x.iter().peekable())), 399 _ => Err(de::Error::invalid_type(value.into(), &"map")), 400 } 401 } 402 deserialize_struct<V: de::Visitor<'de>>( self, _name: &'static str, _fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error>403 fn deserialize_struct<V: de::Visitor<'de>>( 404 self, 405 _name: &'static str, 406 _fields: &'static [&'static str], 407 visitor: V, 408 ) -> Result<V::Value, Self::Error> { 409 self.deserialize_map(visitor) 410 } 411 deserialize_tuple<V: de::Visitor<'de>>( self, _len: usize, visitor: V, ) -> Result<V::Value, Self::Error>412 fn deserialize_tuple<V: de::Visitor<'de>>( 413 self, 414 _len: usize, 415 visitor: V, 416 ) -> Result<V::Value, Self::Error> { 417 self.deserialize_seq(visitor) 418 } 419 deserialize_tuple_struct<V: de::Visitor<'de>>( self, _name: &'static str, _len: usize, visitor: V, ) -> Result<V::Value, Self::Error>420 fn deserialize_tuple_struct<V: de::Visitor<'de>>( 421 self, 422 _name: &'static str, 423 _len: usize, 424 visitor: V, 425 ) -> Result<V::Value, Self::Error> { 426 self.deserialize_seq(visitor) 427 } 428 deserialize_identifier<V: de::Visitor<'de>>( self, visitor: V, ) -> Result<V::Value, Self::Error>429 fn deserialize_identifier<V: de::Visitor<'de>>( 430 self, 431 visitor: V, 432 ) -> Result<V::Value, Self::Error> { 433 self.deserialize_str(visitor) 434 } 435 deserialize_ignored_any<V: de::Visitor<'de>>( self, visitor: V, ) -> Result<V::Value, Self::Error>436 fn deserialize_ignored_any<V: de::Visitor<'de>>( 437 self, 438 visitor: V, 439 ) -> Result<V::Value, Self::Error> { 440 self.deserialize_any(visitor) 441 } 442 443 #[inline] deserialize_option<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>444 fn deserialize_option<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 445 match self.0 { 446 Value::Null => visitor.visit_none(), 447 x => visitor.visit_some(Self(x)), 448 } 449 } 450 451 #[inline] deserialize_unit<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>452 fn deserialize_unit<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> { 453 match self.0 { 454 Value::Null => visitor.visit_unit(), 455 _ => Err(de::Error::invalid_type(self.0.into(), &"null")), 456 } 457 } 458 459 #[inline] deserialize_unit_struct<V: de::Visitor<'de>>( self, _name: &'static str, visitor: V, ) -> Result<V::Value, Self::Error>460 fn deserialize_unit_struct<V: de::Visitor<'de>>( 461 self, 462 _name: &'static str, 463 visitor: V, 464 ) -> Result<V::Value, Self::Error> { 465 self.deserialize_unit(visitor) 466 } 467 468 #[inline] deserialize_newtype_struct<V: de::Visitor<'de>>( self, _name: &'static str, visitor: V, ) -> Result<V::Value, Self::Error>469 fn deserialize_newtype_struct<V: de::Visitor<'de>>( 470 self, 471 _name: &'static str, 472 visitor: V, 473 ) -> Result<V::Value, Self::Error> { 474 visitor.visit_newtype_struct(self) 475 } 476 477 #[inline] deserialize_enum<V: de::Visitor<'de>>( self, name: &'static str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error>478 fn deserialize_enum<V: de::Visitor<'de>>( 479 self, 480 name: &'static str, 481 variants: &'static [&'static str], 482 visitor: V, 483 ) -> Result<V::Value, Self::Error> { 484 if name == "@@TAG@@" { 485 let (tag, val) = match self.0 { 486 Value::Tag(t, v) => (Some(*t), v.as_ref()), 487 v => (None, v), 488 }; 489 490 let parent: Deserializer<&Value> = Deserializer(val); 491 let access = crate::tag::TagAccess::new(parent, tag); 492 return visitor.visit_enum(access); 493 } 494 495 match self.0 { 496 Value::Tag(.., v) => Deserializer(v.as_ref()).deserialize_enum(name, variants, visitor), 497 Value::Map(x) if x.len() == 1 => visitor.visit_enum(Deserializer(&x[0])), 498 x @ Value::Text(..) => visitor.visit_enum(Deserializer(x)), 499 _ => Err(de::Error::invalid_type(self.0.into(), &"map")), 500 } 501 } 502 is_human_readable(&self) -> bool503 fn is_human_readable(&self) -> bool { 504 false 505 } 506 } 507 508 impl<'a, 'de, T: Iterator<Item = &'a Value>> de::SeqAccess<'de> for Deserializer<T> { 509 type Error = Error; 510 511 #[inline] next_element_seed<U: de::DeserializeSeed<'de>>( &mut self, seed: U, ) -> Result<Option<U::Value>, Self::Error>512 fn next_element_seed<U: de::DeserializeSeed<'de>>( 513 &mut self, 514 seed: U, 515 ) -> Result<Option<U::Value>, Self::Error> { 516 match self.0.next() { 517 None => Ok(None), 518 Some(v) => seed.deserialize(Deserializer(v)).map(Some), 519 } 520 } 521 } 522 523 impl<'a, 'de, T: Iterator<Item = &'a (Value, Value)>> de::MapAccess<'de> 524 for Deserializer<Peekable<T>> 525 { 526 type Error = Error; 527 528 #[inline] next_key_seed<K: de::DeserializeSeed<'de>>( &mut self, seed: K, ) -> Result<Option<K::Value>, Self::Error>529 fn next_key_seed<K: de::DeserializeSeed<'de>>( 530 &mut self, 531 seed: K, 532 ) -> Result<Option<K::Value>, Self::Error> { 533 match self.0.peek() { 534 None => Ok(None), 535 Some(x) => Ok(Some(seed.deserialize(Deserializer(&x.0))?)), 536 } 537 } 538 539 #[inline] next_value_seed<V: de::DeserializeSeed<'de>>( &mut self, seed: V, ) -> Result<V::Value, Self::Error>540 fn next_value_seed<V: de::DeserializeSeed<'de>>( 541 &mut self, 542 seed: V, 543 ) -> Result<V::Value, Self::Error> { 544 seed.deserialize(Deserializer(&self.0.next().unwrap().1)) 545 } 546 } 547 548 impl<'a, 'de> de::EnumAccess<'de> for Deserializer<&'a (Value, Value)> { 549 type Error = Error; 550 type Variant = Deserializer<&'a Value>; 551 552 #[inline] variant_seed<V: de::DeserializeSeed<'de>>( self, seed: V, ) -> Result<(V::Value, Self::Variant), Self::Error>553 fn variant_seed<V: de::DeserializeSeed<'de>>( 554 self, 555 seed: V, 556 ) -> Result<(V::Value, Self::Variant), Self::Error> { 557 let k = seed.deserialize(Deserializer(&self.0 .0))?; 558 Ok((k, Deserializer(&self.0 .1))) 559 } 560 } 561 562 impl<'a, 'de> de::EnumAccess<'de> for Deserializer<&'a Value> { 563 type Error = Error; 564 type Variant = Deserializer<&'a Value>; 565 566 #[inline] variant_seed<V: de::DeserializeSeed<'de>>( self, seed: V, ) -> Result<(V::Value, Self::Variant), Self::Error>567 fn variant_seed<V: de::DeserializeSeed<'de>>( 568 self, 569 seed: V, 570 ) -> Result<(V::Value, Self::Variant), Self::Error> { 571 let k = seed.deserialize(self)?; 572 Ok((k, Deserializer(&Value::Null))) 573 } 574 } 575 576 impl<'a, 'de> de::VariantAccess<'de> for Deserializer<&'a Value> { 577 type Error = Error; 578 579 #[inline] unit_variant(self) -> Result<(), Self::Error>580 fn unit_variant(self) -> Result<(), Self::Error> { 581 match self.0 { 582 Value::Null => Ok(()), 583 _ => Err(de::Error::invalid_type(self.0.into(), &"unit")), 584 } 585 } 586 587 #[inline] newtype_variant_seed<U: de::DeserializeSeed<'de>>( self, seed: U, ) -> Result<U::Value, Self::Error>588 fn newtype_variant_seed<U: de::DeserializeSeed<'de>>( 589 self, 590 seed: U, 591 ) -> Result<U::Value, Self::Error> { 592 seed.deserialize(self) 593 } 594 595 #[inline] tuple_variant<V: de::Visitor<'de>>( self, _len: usize, visitor: V, ) -> Result<V::Value, Self::Error>596 fn tuple_variant<V: de::Visitor<'de>>( 597 self, 598 _len: usize, 599 visitor: V, 600 ) -> Result<V::Value, Self::Error> { 601 self.deserialize_seq(visitor) 602 } 603 604 #[inline] struct_variant<V: de::Visitor<'de>>( self, _fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error>605 fn struct_variant<V: de::Visitor<'de>>( 606 self, 607 _fields: &'static [&'static str], 608 visitor: V, 609 ) -> Result<V::Value, Self::Error> { 610 self.deserialize_map(visitor) 611 } 612 } 613 614 impl Value { 615 /// Deserializes the `Value` into an object 616 #[inline] deserialized<'de, T: de::Deserialize<'de>>(&self) -> Result<T, Error>617 pub fn deserialized<'de, T: de::Deserialize<'de>>(&self) -> Result<T, Error> { 618 T::deserialize(Deserializer(self)) 619 } 620 } 621