Skip to content

Commit 5b45614

Browse files
committed
feat!: now Dom::render_element and mount_to_dom_element accepts element instead of get_element
1 parent 4eb153b commit 5b45614

File tree

5 files changed

+23
-18
lines changed

5 files changed

+23
-18
lines changed

crates/frender-dom/src/context.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,10 @@ impl Dom {
9393

9494
pub async fn render_element<E: UpdateRenderState<Dom>>(
9595
&mut self,
96-
mut get_element: impl FnMut() -> E,
96+
element: E,
9797
stop: impl IntoFuture<Output = ()>,
9898
) {
99-
let state = get_element().initialize_render_state(self);
99+
let state = element.initialize_render_state(self);
100100

101101
futures_lite::pin!(state);
102102

crates/frender-dom/src/mount.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ where
2424
}
2525
}
2626

27-
pub fn mount_to_dom_element<'e, E: UpdateRenderState<Dom>>(
28-
get_element: impl FnMut() -> E + 'e,
27+
pub fn mount_to_dom_element<'e, E: UpdateRenderState<Dom> + 'e>(
28+
element: E,
2929
get_dom_element: impl GetDomElement,
3030
) -> impl std::future::Future<Output = ()> + 'e {
3131
let window = web_sys::window().unwrap();
@@ -35,14 +35,14 @@ pub fn mount_to_dom_element<'e, E: UpdateRenderState<Dom>>(
3535

3636
async move {
3737
Dom::new(document, current_parent)
38-
.render_element(get_element, std::future::pending())
38+
.render_element(element, std::future::pending())
3939
.await
4040
}
4141
}
4242

4343
#[cfg(feature = "spawn")]
4444
pub fn spawn_mount_to_dom_element<E: UpdateRenderState<Dom> + 'static>(
45-
get_element: impl FnMut() -> E + 'static,
45+
get_element: E,
4646
get_dom_element: impl GetDomElement,
4747
) {
4848
wasm_bindgen_futures::spawn_local(mount_to_dom_element(get_element, get_dom_element))

crates/frender-hook-element/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ macro_rules! __impl_main_fn {
5959
) => {
6060
$vis fn $main () {
6161
$crate::__private::main::spawn_mount_to_dom_element(
62-
|| $name(),
62+
$name(),
6363
$crate::__private::expand_or!(
6464
[
6565
$($($get_dom_element)*)?

crates/frender-macros/src/component_macro/main_item.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use darling::ToTokens;
21
use proc_macro2::{Span, TokenStream};
32
use quote::quote_spanned;
43
use syn::spanned::Spanned;
@@ -11,7 +10,7 @@ pub struct MainItem<'a> {
1110
pub hook_element_path: &'a syn::Path,
1211
pub options: &'a ComponentMainOptions,
1312
pub vis: &'a syn::Visibility,
14-
pub expr_get_element: &'a dyn ToTokens,
13+
pub expr_element: TokenStream,
1514
}
1615

1716
impl<'a> MainItem<'a> {
@@ -26,7 +25,7 @@ impl<'a> MainItem<'a> {
2625
get_dom_element,
2726
},
2827
vis,
29-
expr_get_element,
28+
expr_element,
3029
} = self;
3130

3231
let ident = proc_macro2::Ident::new("main", span_fn_ident);
@@ -39,7 +38,7 @@ impl<'a> MainItem<'a> {
3938
quote_spanned! {span_default=>
4039
#vis fn #ident() {
4140
#hook_element_path #path_dom(
42-
#expr_get_element,
41+
#expr_element,
4342
#get_dom_element
4443
)
4544
}

crates/frender-macros/src/component_to_tokens.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use proc_macro2::TokenStream;
2-
use quote::{quote, ToTokens};
1+
use proc_macro2::{Span, TokenStream};
2+
use quote::{quote, quote_spanned, ToTokens};
33
use syn::spanned::Spanned;
44

55
use crate::{
@@ -31,17 +31,23 @@ impl ComponentDefinition {
3131

3232
let main_block = main.map(|main| {
3333
let span = main.original.path().span();
34+
let expr_element;
35+
36+
if bg.is_some() {
37+
todo!("bg")
38+
} else {
39+
let name = &item_fn.sig.ident;
40+
let span = Span::call_site().located_at(name.span());
41+
expr_element = quote_spanned!(span => #name() )
42+
}
43+
3444
MainItem {
3545
span_default: span,
3646
span_fn_ident: span,
3747
hook_element_path: &hook_element_path,
3848
options: &main.parsed,
3949
vis: &item_fn.vis,
40-
expr_get_element: if bg.is_some() {
41-
todo!("bg")
42-
} else {
43-
&item_fn.sig.ident
44-
},
50+
expr_element,
4551
}
4652
.into_ts()
4753
});

0 commit comments

Comments
 (0)