diff --git a/CHANGELOG.md b/CHANGELOG.md index 7abd332db..f6da90b87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix issue [#410](https://github.com/ron-rs/ron/issues/410) trailing comma parsing in tuples and `Some` ([#412](https://github.com/ron-rs/ron/pull/412)) - Error instead of panic when deserializing non-identifiers as field names ([#415](https://github.com/ron-rs/ron/pull/415)) - Breaking: Fix issue [#307](https://github.com/ron-rs/ron/issues/307) stack overflow with explicit recursion limits in serialising and deserialising ([#420](https://github.com/ron-rs/ron/pull/420)) +- Fix issue [#423](https://github.com/ron-rs/ron/issues/423) deserialising an identifier into a borrowed str ([#424](https://github.com/ron-rs/ron/pull/424)) ## [0.8.0] - 2022-08-17 diff --git a/src/de/mod.rs b/src/de/mod.rs index b42e823af..78c0c3253 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -651,7 +651,7 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> { self.last_identifier = Some(identifier); - visitor.visit_str(identifier) + visitor.visit_borrowed_str(identifier) } fn deserialize_ignored_any(self, visitor: V) -> Result diff --git a/tests/423_de_borrowed_identifier.rs b/tests/423_de_borrowed_identifier.rs new file mode 100644 index 000000000..3333d290d --- /dev/null +++ b/tests/423_de_borrowed_identifier.rs @@ -0,0 +1,43 @@ +use std::any::Any; + +use serde::{ + de::{MapAccess, Visitor}, + Deserializer, +}; + +#[test] +fn manually_deserialize_dyn() { + let ron = r#"SerializeDyn( + type: "engine_utils::types::registry::tests::Player", + )"#; + + let mut de = ron::Deserializer::from_bytes(ron.as_bytes()).unwrap(); + + let result = de + .deserialize_struct("SerializeDyn", &["type"], SerializeDynVisitor) + .unwrap(); + + assert_eq!( + *result.downcast::>().unwrap(), + Some(( + String::from("type"), + String::from("engine_utils::types::registry::tests::Player") + )) + ); +} + +struct SerializeDynVisitor; + +impl<'de> Visitor<'de> for SerializeDynVisitor { + type Value = Box; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(formatter, "a serialize dyn struct") + } + + fn visit_map>(self, mut map: A) -> Result { + let entry = map.next_entry::<&str, String>()?; + + Ok(Box::new(entry.map(|(k, v)| (String::from(k), v)))) + } +}