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 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 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;