Skip to main content

freenet_scaffold/
lib.rs

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