Expand description
Thread-safe, mutable application states for rust.
§Examples
§Initializing the state
Any app state that may be used must be initialized first.
Note: An AppState can not be used as a MutAppState and vice versa.
This means that AppState and MutAppState must be initialized separately
and use independent values, even if they are of the same type.
use app_state::{AppState, MutAppState, AppStateTrait};
struct MyState {
counter: u32,
}
fn main() {
// Initialize the app state
AppState::init(MyState { counter: 0 });
// Initialize the mutable app state
MutAppState::init(MyState { counter: 0 });
}§Using derive
In order to avoid boilerplate code, the InitAppState and InitMutAppState
traits can be derived for any struct. These traits provide the init_app_state
and init_mut_app_state methods respectively which can be used to initialize
the state more easily.
use app_state::{AppState, MutAppState, AppStateTrait, InitAppState, InitMutAppState};
#[derive(Default, InitAppState, InitMutAppState)]
struct MyState {
counter: u32,
}
fn main() {
MyState::default().init_app_state();
MyState::default().init_mut_app_state();
}§Read-only state
App states internally use Arc to allow for thread-safe access.
use app_state::{AppState, AppStateTrait, stateful};
struct MyState {
counter: u32,
}
#[stateful]
fn func(state: AppState<MyState>) {
println!("Counter: {}", state.counter);
}§Mutable state
Mutable states internally use a Mutex to ensure thread-safety.
This means that when reading from or writing to the state, the mutex must be locked.
This can be done either by calling get_mut() or by using the MutAppStateLock type.
use app_state::{MutAppState, AppStateTrait, stateful};
struct MyState {
counter: u32,
}
#[stateful]
fn func(state: MutAppState<MyState>) {
let mut state = state.get_mut();
state.counter += 1;
}§Mutable state (locked)
In order to mutate the state, you must first lock it.
This can be done either by calling get_mut() or by using the MutAppStateLock type.
use app_state::{MutAppState, MutAppStateLock, AppStateTrait, stateful};
struct MyState {
counter: u32,
}
#[stateful]
fn func(mut state: MutAppStateLock<MyState>) {
state.counter += 1;
}§Get the state manually
You can also get the state manually by calling AppState::get() or MutAppState::get().
use app_state::{AppState, MutAppState, AppStateTrait};
struct MyState {
counter: u32,
}
fn main() {
let state = AppState::<MyState>::get();
let mut_state = MutAppState::<MyState>::get();
}Structs§
- AppState
- A thread-safe, read-only state container.
- MutApp
State - A mutable app state.
- MutApp
State Lock - The lock guard for a mutable app state.
This is a wrapper around
MutexGuard. When this guard is dropped, the lock will be released. As this locks the state, no other thread can access the state until this guard is dropped.
Traits§
Attribute Macros§
- init_
default_ mut_ state - Initialize the default state of the annotated struct
on application startup using
ctor. The default state is the result of callingDefault::default(). - init_
default_ state - Initialize the default state of the annotated struct
on application startup using
ctor. The default state is the result of callingDefault::default(). - stateful
- Inject app states into the annotated function.
Derive Macros§
- Init
AppState - Derive macro for
InitAppState. Allows you to initialize app states withinit_app_state. - Init
MutApp State - Derive macro for
InitMutAppState. Allows you to initialize app states withinit_mut_app_state.