Browse Source

fix issue 1586 (#2725)

Adam Kundrát 11 months ago
parent
commit
3db24934d6
2 changed files with 17 additions and 0 deletions
  1. 16 0
      packages/core/src/hotreload_utils.rs
  2. 1 0
      packages/core/src/nodes.rs

+ 16 - 0
packages/core/src/hotreload_utils.rs

@@ -71,3 +71,19 @@ pub enum FmtSegment {
         id: usize,
     },
 }
+
+/// A helper function for deserializing to a `&'static str`.
+/// Parses escaped characters (like `"\n"` or `"\t"`),
+/// which cannot be done in-place using the default serde json deserializer.
+///
+/// **Leaks the memory** in order to achieve a `'static` reference.
+///
+/// Solves [this issue](https://github.com/DioxusLabs/dioxus/issues/1586).
+#[doc(hidden)]
+pub fn static_str_deserializer<'de, D>(deserializer: D) -> Result<&'static str, D::Error>
+where
+    D: serde::de::Deserializer<'de>,
+{
+    <String as serde::Deserialize>::deserialize(deserializer)
+        .map(|s| Box::leak(Box::new(s)) as &'static str)
+}

+ 1 - 0
packages/core/src/nodes.rs

@@ -523,6 +523,7 @@ pub enum TemplateNode {
     /// This template node is just a piece of static text
     Text {
         /// The actual text
+        #[serde(deserialize_with = "crate::hotreload_utils::static_str_deserializer")]
         text: &'static str,
     },