1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
macro_rules! define_options {
(
$struct:ident . $options_field:ident ;
$(
$field_name:ident : $field_type:ty = $field_default:expr ,
)*
$(
@with_setters
$(
$auto_field_name:ident : $auto_field_type:ty = $auto_field_default:expr
),*
)?
) => {
#[derive(reactive_stores_macro::Store)]
struct Options {
$(
$field_name: $field_type,
)*
$(
$(
$auto_field_name: $auto_field_type,
)*
)?
}
impl Default for Options {
fn default() -> Self {
Self {
$(
$field_name: $field_default,
)*
$(
$(
$auto_field_name: $auto_field_default,
)*
)?
}
}
}
impl $struct {
paste::paste! {
$($(
pub fn $auto_field_name(self, value: impl Into< $auto_field_type >) -> Self {
use leptos::prelude::Set;
self.$options_field.clone().$auto_field_name().set(value.into());
self
}
pub fn [< $auto_field_name _signal >](
self,
value: impl leptos::prelude::Get<Value = $auto_field_type> + Send + Sync + 'static
) -> Self {
use leptos::prelude::{ImmediateEffect, Set, StoredValue};
let field = self.$options_field.clone().$auto_field_name();
StoredValue::new(ImmediateEffect::new(move || {
field.set(value.get());
}));
self
}
)*)?
}
}
};
}
pub(crate) use define_options;