2 releases

0.0.2 May 8, 2023
0.0.1 May 8, 2023

#1638 in Rust patterns

30 downloads per month
Used in 2 crates

MIT/Apache

9KB
126 lines

Derive macro for State Management

Crates.io Docs.rs

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 derive macro and the Rc/Ref Collection signal types

currently for lifetime management this crate uses widely sycamore::reactive::create_signal_unsafe if you think there are possible unsafe errors feel free to open an issue

Current Features

  • Support for Generic States
  • Support for lifetimes

Planned Features

  • Better compile errors
  • Support for closure bindings
  • Support for derived state
  • macro for automatic context providing

Usage

#[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>>
}

#[derive(Debug, State, Clone)]
#[state(clone, eq, debug)]
pub struct MyInnerState<'a> {
    pub field_1: i64,
    #[collection]
    pub collection: Vec<&'a str>
}


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

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>,
}

Dependencies

~3.5MB
~61K SLoC