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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//! # Overview
//!
//! sycamore-state is a utility library for better state management using sycamore's reactive primitives
//!
//! the main features of this crate are the [`State`](State) derive macro and Rc/Ref Collection signal types
//!
//! currently for lifetime management this crate uses widely [`sycamore::reactive::create_signal_unsafe`],\n
//! if you think there are possible unsafe errors feel free to open an [`issue`](https://github.com/ChristianBelloni/sycamore-state/issues)
//!
//! # Usage
//!
//! ```rust
//! # use sycamore_state_manager::State;
//!
//! #[derive(Debug, State, Clone)]
//! #[state(clone, eq, debug)] // available derive macros are: (clone, debug, eq, ord)
//! pub struct MyState<'a> {
//!     pub field_1: String,
//!     pub field_2: u32,
//!     #[state]
//!     pub field_3: MyInnerState<'a>,
//!     #[state]
//!     #[collection]
//!     pub state_collection: Vec<MyInnerState<'a>>
//! } // From this struct two reactive structs will be generated
//!   // for more info see the State docs
//!
//! #[derive(Debug, State, Clone)]
//! #[state(clone, eq, debug)]
//! pub struct MyInnerState<'a> {
//!     pub field_1: i64,
//!     #[collection]
//!     pub collection: Vec<&'a str>
//! } // From this struct two reactive structs will be generated
//!   // for more info see the State docs
//!
//!# pub fn main() {
//!# sycamore::prelude::create_scope(|cx| {
//! let ref_state = RefMyState::new(cx, MyState {
//!     field_1: "my_string".into(),
//!     field_2: 5,
//!     field_3: MyInnerState {
//!         field_1: 20,
//!         collection: vec!["my", "string", "collection"],
//!     },
//!     state_collection: Default::default()
//! });  
//!# });
//!# }
//! ```

pub use sycamore_state_core::{RcCollectionSignal, RefCollectionSignal};

#[doc(inline)]
/// Derive macro for State Management
///
/// # Usage
///
/// ```rust
/// # use sycamore_state_manager::State;
///
/// #[derive(Debug, State, Clone)]
/// #[state(clone, eq, debug)] // avaliable derive macros are: (clone, debug, eq, ord)
/// pub struct MyState<'a> {
///     pub field_1: String,
///     pub field_2: u32,
///     #[state]
///     pub field_3: MyInnerState<'a>,
///     #[state]
///     #[collection]
///     pub state_collection: Vec<MyInnerState<'a>>
/// }
///
/// #[derive(Debug, State, Clone)]
/// #[state(clone, eq, debug)]
/// pub struct MyInnerState<'a> {
///     pub field_1: i64,
///     #[collection]
///     pub collection: Vec<&'a str>
/// }
///
///# pub fn main() {
///# sycamore::prelude::create_scope(|cx| {
/// let ref_state = RefMyState::new(cx, MyState {
///     field_1: "my_string".into(),
///     field_2: 5,
///     field_3: MyInnerState {
///         field_1: 20,
///         collection: vec!["my", "string", "collection"],
///     },
///     state_collection: Default::default()
/// });  
///# });
///# }
/// ```
///
/// # Generated Structs
/// ```ignore
/// pub struct RcMyState<'a> {
///     pub field_1: RcSignal<String>,
///     pub field_2: RcSignal<u32>,
///     pub field_3: RcSignal<RcMyInnerState<'a>>,
///     pub state_collection: RcCollectionSignal<RcMyInnerState<'a>>,
/// }
///
/// pub struct RcMyInnerState<'a> {
///     pub field_1: RcSignal<i64>,
///     pub collection: RcCollectionSignal<&'a str>,
/// }
///
/// pub struct RefMyState<'a, 'stateful> {
///     pub field_1: &'stateful Signal<String>,
///     pub field_2: &'stateful Signal<u32>,
///     pub field_3: &'stateful Signal<RefMyInnerState<'a, 'stateful>>,
///     pub state_collection: RefCollectionSignal<'stateful, RefMyInnerState<'a, 'stateful>>,
/// }
///
/// pub struct RefMyInnerState<'a, 'stateful> {
///     pub field_1: &'stateful Signal<i64>,
///     pub collection: RefCollectionSignal<'stateful, &'a str>,
/// }
/// ```
pub use sycamore_state_macros::State;