feat(core): Add serde trait bounds to FSM types
These are required by multiple backend implementations, and any attempt at making them optional will result in less appreciable APIs.
This commit is contained in:
parent
536793dbbb
commit
1a90856ba4
2 changed files with 20 additions and 10 deletions
|
@ -4,3 +4,4 @@ version = "0.1.0"
|
||||||
authors = ["Vincent Ambo <mail@tazj.in>"]
|
authors = ["Vincent Ambo <mail@tazj.in>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
serde = "1.0"
|
||||||
|
|
|
@ -108,6 +108,10 @@
|
||||||
//!
|
//!
|
||||||
//! Please reach out! I want to know why!
|
//! Please reach out! I want to know why!
|
||||||
|
|
||||||
|
extern crate serde;
|
||||||
|
|
||||||
|
use serde::Serialize;
|
||||||
|
use serde::de::DeserializeOwned;
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
|
||||||
|
@ -199,13 +203,12 @@ pub fn advance<S: FSM>(state: S, event: S::Event) -> (S, Vec<S::Action>) {
|
||||||
///
|
///
|
||||||
/// See the `finito-postgres` and `finito-in-mem` crates for example
|
/// See the `finito-postgres` and `finito-in-mem` crates for example
|
||||||
/// implementations of this trait.
|
/// implementations of this trait.
|
||||||
pub trait FSMBackend {
|
///
|
||||||
/// Custom state type that is made available to action handlers by
|
/// Backends must be parameterised over an additional (user-supplied)
|
||||||
/// the backend.
|
/// state type which can be used to track application state that must
|
||||||
///
|
/// be made available to action handlers, for example to pass along
|
||||||
/// TODO: Something something `Into<FSM::State> for State`.
|
/// database connections.
|
||||||
type State;
|
pub trait FSMBackend<S> {
|
||||||
|
|
||||||
/// Key type used to identify individual state machines in this
|
/// Key type used to identify individual state machines in this
|
||||||
/// backend.
|
/// backend.
|
||||||
///
|
///
|
||||||
|
@ -219,10 +222,12 @@ pub trait FSMBackend {
|
||||||
|
|
||||||
/// Insert a new state-machine into the backend's storage and
|
/// Insert a new state-machine into the backend's storage and
|
||||||
/// return its newly allocated key.
|
/// return its newly allocated key.
|
||||||
fn insert_machine<S: FSM>(&self, initial: S) -> Result<Self::Key, Self::Error>;
|
fn insert_machine<F>(&self, initial: F) -> Result<Self::Key, Self::Error>
|
||||||
|
where F: FSM + Serialize + DeserializeOwned;
|
||||||
|
|
||||||
/// Retrieve the current state of an FSM by its key.
|
/// Retrieve the current state of an FSM by its key.
|
||||||
fn get_machine<S: FSM>(&self, key: Self::Key) -> Result<S, Self::Error>;
|
fn get_machine<F: FSM>(&self, key: Self::Key) -> Result<F, Self::Error>
|
||||||
|
where F: FSM + Serialize + DeserializeOwned;
|
||||||
|
|
||||||
/// Advance a state machine by applying an event and persisting it
|
/// Advance a state machine by applying an event and persisting it
|
||||||
/// as well as any resulting actions.
|
/// as well as any resulting actions.
|
||||||
|
@ -230,5 +235,9 @@ pub trait FSMBackend {
|
||||||
/// **Note**: Whether actions are automatically executed depends
|
/// **Note**: Whether actions are automatically executed depends
|
||||||
/// on the backend used. Please consult the backend's
|
/// on the backend used. Please consult the backend's
|
||||||
/// documentation for details.
|
/// documentation for details.
|
||||||
fn advance<S: FSM>(&self, key: Self::Key, event: S::Event) -> Result<S, Self::Error>;
|
fn advance<F: FSM>(&self, key: Self::Key, event: F::Event) -> Result<F, Self::Error>
|
||||||
|
where F: FSM + Serialize + DeserializeOwned,
|
||||||
|
F::State: From<S>,
|
||||||
|
F::Event: Serialize + DeserializeOwned,
|
||||||
|
F::Action: Serialize + DeserializeOwned;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue