p2panda_encryption/data_scheme/test_utils/
dgm.rs1use std::collections::HashSet;
4use std::convert::Infallible;
5use std::marker::PhantomData;
6
7use serde::{Deserialize, Serialize};
8
9use crate::traits::{GroupMembership, IdentityHandle, OperationId};
10
11#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
12pub struct TestDgm<ID, OP> {
13 _marker: PhantomData<(ID, OP)>,
14}
15
16impl<ID, OP> TestDgm<ID, OP>
17where
18 ID: IdentityHandle + Serialize + for<'a> Deserialize<'a>,
19{
20 pub fn init(my_id: ID) -> TestDgmState<ID, OP> {
21 TestDgmState {
22 my_id,
23 members: HashSet::new(),
24 _marker: PhantomData,
25 }
26 }
27}
28
29#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
30pub struct TestDgmState<ID, OP>
31where
32 ID: IdentityHandle,
33{
34 my_id: ID,
35 members: HashSet<ID>,
36 _marker: PhantomData<OP>,
37}
38
39impl<ID, OP> GroupMembership<ID, OP> for TestDgm<ID, OP>
40where
41 ID: IdentityHandle + Serialize + for<'a> Deserialize<'a>,
42 OP: OperationId + Serialize + for<'a> Deserialize<'a>,
43{
44 type State = TestDgmState<ID, OP>;
45
46 type Error = Infallible;
47
48 fn create(my_id: ID, initial_members: &[ID]) -> Result<Self::State, Self::Error> {
49 Ok(TestDgmState {
50 my_id,
51 members: HashSet::from_iter(initial_members.iter().cloned()),
52 _marker: PhantomData,
53 })
54 }
55
56 fn from_welcome(my_id: ID, y: Self::State) -> Result<Self::State, Self::Error> {
57 Ok(TestDgmState {
58 my_id,
59 members: y.members,
60 _marker: PhantomData,
61 })
62 }
63
64 fn add(
65 mut y: Self::State,
66 _adder: ID,
67 added: ID,
68 _operation_id: OP,
69 ) -> Result<Self::State, Self::Error> {
70 y.members.insert(added);
71 Ok(y)
72 }
73
74 fn remove(
75 mut y: Self::State,
76 _remover: ID,
77 removed: &ID,
78 _operation_id: OP,
79 ) -> Result<Self::State, Self::Error> {
80 y.members.remove(removed);
81 Ok(y)
82 }
83
84 fn members(y: &Self::State) -> Result<HashSet<ID>, Self::Error> {
85 Ok(y.members.clone())
86 }
87}