Merge pull request #1146 from traxys/master

Add a helper macro for properties & async
This commit is contained in:
Jon Kelley authored and GitHub committed 2023-07-06 11:34:34 -07:00
commit 911d1b4b2f
1 file changed
+35 -6
+35 -6
View File
@@ -1,24 +1,53 @@
#[macro_export]
/// A helper macro for using hooks in async environements.
/// A helper macro for using hooks and properties in async environements.
///
/// # Usage
///
///
/// ```ignore
/// ```
/// # use dioxus::prelude::*;
/// #
/// # #[derive(Props, PartialEq)]
/// # struct Props {
/// # prop: String,
/// # }
/// # fn Component(cx: Scope<Props>) -> Element {
///
/// let (data) = use_ref(cx, || {});
///
/// let handle_thing = move |_| {
/// to_owned![data]
/// to_owned![data, cx.props.prop];
/// cx.spawn(async move {
/// // do stuff
/// });
/// }
/// };
/// # handle_thing(());
/// # None }
/// ```
macro_rules! to_owned {
($($es:ident),+) => {$(
// Rule matching simple symbols without a path
($es:ident $(, $($rest:tt)*)?) => {
#[allow(unused_mut)]
let mut $es = $es.to_owned();
)*}
$( to_owned![$($rest)*] )?
};
// We need to find the last element in a path, for this we need to unstack the path part by
// part using, separating what we have with a '@'
($($deref:ident).* $(, $($rest:tt)*)?) => {
to_owned![@ $($deref).* $(, $($rest)*)?]
};
// Take the head of the path and add it to the list of $deref
($($deref:ident)* @ $head:ident $( . $tail:ident)+ $(, $($rest:tt)*)?) => {
to_owned![$($deref)* $head @ $($tail).+ $(, $($rest)*)?]
};
// We have exhausted the path, use the last as a name
($($deref:ident)* @ $last:ident $(, $($rest:tt)*)? ) => {
#[allow(unused_mut)]
let mut $last = $($deref .)* $last .to_owned();
$(to_owned![$($rest)*])?
};
}
mod usecontext;