瀏覽代碼

WIP implement hot reloading context for html

= 2 年之前
父節點
當前提交
6d2e510200
共有 3 個文件被更改,包括 146 次插入14 次删除
  1. 1 0
      packages/html/Cargo.toml
  2. 143 13
      packages/html/src/elements.rs
  3. 2 1
      packages/rsx/src/lib.rs

+ 1 - 0
packages/html/Cargo.toml

@@ -12,6 +12,7 @@ keywords = ["dom", "ui", "gui", "react", "wasm"]
 
 [dependencies]
 dioxus-core = { path = "../core", version = "^0.2.1" }
+dioxus-rsx = { path = "../rsx" }
 serde = { version = "1", features = ["derive"], optional = true }
 serde_repr = { version = "0.1", optional = true }
 wasm-bindgen = { version = "0.2.79", optional = true }

+ 143 - 13
packages/html/src/elements.rs

@@ -1,6 +1,6 @@
 #![allow(non_upper_case_globals)]
-
 use crate::{GlobalAttributes, SvgAttributes};
+use dioxus_rsx::HotReloadingContext;
 
 pub type AttributeDiscription = (&'static str, Option<&'static str>, bool);
 
@@ -41,6 +41,29 @@ macro_rules! impl_attribute {
     };
 }
 
+macro_rules! impl_attribute_match {
+    (
+        $(#[$attr_method:meta])*
+        $fil:ident: $vil:ident (DEFAULT),
+    ) => {
+        stringify!($fil) => Some((stringify!($fil), None))
+    };
+
+    (
+        $(#[$attr_method:meta])*
+        $fil:ident: $vil:ident ($name:literal),
+    ) => {
+        stringify!($fil) => Some(($name, None))
+    };
+
+    (
+        $(#[$attr_method:meta])*
+        $fil:ident: $vil:ident (in $ns:ident),
+    ) => {
+        stringify!($fil) => Some((stringify!(fil), Some(stringify!(ns))))
+    };
+}
+
 macro_rules! impl_element {
     (
         $(#[$attr:meta])*
@@ -55,7 +78,6 @@ macro_rules! impl_element {
         $(#[$attr])*
         pub struct $name;
 
-
         impl $name {
             pub const TAG_NAME: &'static str = stringify!($name);
             pub const NAME_SPACE: Option<&'static str> = None;
@@ -100,6 +122,78 @@ macro_rules! impl_element {
     }
 }
 
+macro_rules! impl_element_match {
+    (
+        $(#[$attr:meta])*
+        $name:ident None {
+            $(
+                $(#[$attr_method:meta])*
+                $fil:ident: $vil:ident $extra:tt,
+            )*
+        }
+    ) => {
+        if element == stringify!($name) {
+            return Some((stringify!($name), None));
+        }
+    };
+
+    (
+        $(#[$attr:meta])*
+        $name:ident $namespace:ident {
+            $(
+                $(#[$attr_method:meta])*
+                $fil:ident: $vil:ident $extra:tt,
+            )*
+        }
+    ) => {
+        if element == stringify!($name) {
+            return Some((stringify!($name), Some(stringify!($namespace))));
+        }
+    };
+}
+
+macro_rules! impl_element_match_attributes {
+    (
+        $(#[$attr:meta])*
+        $name:ident None {
+            $(
+                $(#[$attr_method:meta])*
+                $fil:ident: $vil:ident $extra:tt,
+            )*
+        }
+    ) => {
+        stringify!($name) => match attr{
+            $(
+                impl_attribute_match!(
+                    $(#[$attr_method])*
+                    $fil: $vil ($extra),
+                ),
+            )*
+            _ => None,
+        }
+    };
+
+    (
+        $(#[$attr:meta])*
+        $name:ident $namespace:tt {
+            $(
+                $(#[$attr_method:meta])*
+                $fil:ident: $vil:ident $extra:tt,
+            )*
+        }
+    ) => {
+        stringify!($name) => match attr{
+            $(
+                impl_attribute_match!(
+                    $(#[$attr_method])*
+                    $fil: $vil in $namespace $extra
+                ),
+            )*
+            _ => None,
+        }
+    }
+}
+
 macro_rules! builder_constructors {
     (
         $(
@@ -111,18 +205,54 @@ macro_rules! builder_constructors {
                 )*
             };
          )*
-    ) => {
-        $(
-            impl_element!(
-                $(#[$attr])*
-                $name $namespace {
-                    $(
-                        $(#[$attr_method])*
-                        $fil: $vil $extra,
-                    )*
+        ) => {
+        pub struct Html;
+
+        impl HotReloadingContext for Html {
+            fn map_attribute(element: &str, attr: &str) -> Option<(&'static str, Option<&'static str>)> {
+                match element {
+                    // $(
+                    //     impl_element_match_attributes!(
+                    //         $(#[$attr])*
+                    //         $name $namespace {
+                    //             $(
+                    //                 $(#[$attr_method])*
+                    //                 $fil: $vil $extra,
+                    //             )*
+                    //         }
+                    //     )
+                    // )*
+                    _ => None
                 }
-            );
-        )*
+            }
+
+            fn map_element(element: &str) -> Option<(&'static str, Option<&'static str>)> {
+                $(
+                    impl_element_match!(
+                        $(#[$attr])*
+                        $name $namespace {
+                            $(
+                                $(#[$attr_method])*
+                                $fil: $vil $extra,
+                            )*
+                        }
+                    );
+                )*
+                unreachable!()
+            }
+        }
+
+        // $(
+        //     impl_element!(
+        //         $(#[$attr])*
+        //         $name $namespace {
+        //             $(
+        //                 $(#[$attr_method])*
+        //                 $fil: $vil $extra,
+        //             )*
+        //         }
+        //     );
+        // )*
     };
 }
 

+ 2 - 1
packages/rsx/src/lib.rs

@@ -25,7 +25,8 @@ use std::{collections::HashMap, hash::Hash};
 pub use component::*;
 use dioxus_core::{Template, TemplateAttribute, TemplateNode};
 pub use element::*;
-use hot_reloading_context::{Empty, HotReloadingContext};
+use hot_reloading_context::Empty;
+pub use hot_reloading_context::HotReloadingContext;
 pub use ifmt::*;
 use internment::Intern;
 pub use node::*;