Skip to content
Snippets Groups Projects
Unverified Commit 9ab0bdd4 authored by John's avatar John Committed by GitHub
Browse files

Merge pull request #26 from MrGVSV/use-state

Added simple `use_state` proc_macro
parents 5e5c85b1 d1087782
No related branches found
No related tags found
No related merge requests found
......@@ -103,3 +103,52 @@ pub fn dyn_partial_eq(_: TokenStream, input: TokenStream) -> TokenStream {
})
.into()
}
/// Create a state and its setter
///
/// # Arguments
///
/// * `initial_state`: The expression
///
/// returns: (state, set_state)
///
/// # Examples
///
/// ```
/// # use kayak_core::{EventType, OnEvent};
/// use kayak_render_macros::use_state;
///
/// let (count, set_count) = use_state!(0);
///
/// let on_event = OnEvent::new(move |_, event| match event.event_type {
/// EventType::Click => {
/// set_count(foo + 1);
/// }
/// _ => {}
/// });
///
/// rsx! {
/// <>
/// <Button on_event={Some(on_event)}>
/// <Text size={16.0} content={format!("Count: {}", count)}>{}</Text>
/// </Button>
/// </>
/// }
/// ```
#[proc_macro]
pub fn use_state(initial_state: TokenStream) -> TokenStream {
let initial_state = parse_macro_input!(initial_state as syn::Expr);
let result = quote! {{
let state = context.create_state(#initial_state).unwrap();
let cloned_state = state.clone();
let set_state = move |value| {
cloned_state.set(value);
};
let state_value = state.get();
(state.get(), set_state)
}};
TokenStream::from(result)
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment