freenet_scaffold/
lib.rs

1pub mod util;
2
3pub use freenet_scaffold_macro::*;
4use serde::de::DeserializeOwned;
5use serde::Serialize;
6use std::fmt::Debug;
7
8pub trait ComposableState {
9    type ParentState: Serialize + DeserializeOwned + Clone + Debug;
10    type Summary: Serialize + DeserializeOwned + Clone + Debug;
11    type Delta: Serialize + DeserializeOwned + Clone + Debug;
12    type Parameters: Serialize + DeserializeOwned + Clone + Debug;
13
14    fn verify(
15        &self,
16        parent_state: &Self::ParentState,
17        parameters: &Self::Parameters,
18    ) -> Result<(), String>;
19    fn summarize(
20        &self,
21        parent_state: &Self::ParentState,
22        parameters: &Self::Parameters,
23    ) -> Self::Summary;
24    fn delta(
25        &self,
26        parent_state: &Self::ParentState,
27        parameters: &Self::Parameters,
28        old_state_summary: &Self::Summary,
29    ) -> Option<Self::Delta>;
30
31    /// Applies the specified `delta` to the current state.
32    ///
33    /// If delta is None then this function should still make any changes that might be
34    /// required based on other fields in the parent_state which may have changed.
35    fn apply_delta(
36        &mut self,
37        parent_state: &Self::ParentState,
38        parameters: &Self::Parameters,
39        delta: &Option<Self::Delta>,
40    ) -> Result<(), String>;
41
42    /// Merges the current state with another state.
43    fn merge(
44        &mut self,
45        parent_state: &Self::ParentState,
46        parameters: &Self::Parameters,
47        other_state: &Self,
48    ) -> Result<(), String> {
49        let my_summary = self.summarize(parent_state, parameters);
50        let delta_in = other_state.delta(parent_state, parameters, &my_summary);
51        self.apply_delta(parent_state, parameters, &delta_in)?;
52        Ok(())
53    }
54}
55
56#[cfg(test)]
57mod tests;