Skip to content

Commit 4ae13a5

Browse files
committed
Implement IntoDeserializer for Value
This allows users to deserialize from types like `HashMap<String, Value>`.
1 parent f7a4da0 commit 4ae13a5

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

src/value/de.rs

+8
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,14 @@ impl<'de> EnumAccess<'de> for EnumDeserializer {
479479
}
480480
}
481481

482+
impl<'de> IntoDeserializer<'de, Error> for Value {
483+
type Deserializer = Self;
484+
485+
fn into_deserializer(self) -> Self::Deserializer {
486+
self
487+
}
488+
}
489+
482490
struct VariantDeserializer {
483491
value: Option<Value>,
484492
}

tests/test.rs

+20-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use std::{f32, f64};
2626
use std::{i16, i32, i64, i8};
2727
use std::{u16, u32, u64, u8};
2828

29-
use serde::de::{self, Deserialize, IgnoredAny};
29+
use serde::de::{self, Deserialize, IgnoredAny, IntoDeserializer};
3030
use serde::ser::{self, Serialize, Serializer};
3131

3232
use serde_bytes::{ByteBuf, Bytes};
@@ -2179,3 +2179,22 @@ fn test_borrow_in_map_key() {
21792179
let value = json!({ "map": { "1": null } });
21802180
Outer::deserialize(&value).unwrap();
21812181
}
2182+
2183+
#[test]
2184+
fn test_value_into_deserializer() {
2185+
#[derive(Deserialize)]
2186+
struct Outer {
2187+
inner: Inner,
2188+
}
2189+
2190+
#[derive(Deserialize)]
2191+
struct Inner {
2192+
string: String,
2193+
}
2194+
2195+
let mut map = BTreeMap::new();
2196+
map.insert("inner", json!({ "string": "Hello World" }));
2197+
2198+
let outer = Outer::deserialize(map.into_deserializer()).unwrap();
2199+
assert_eq!(outer.inner.string, "Hello World");
2200+
}

0 commit comments

Comments
 (0)