Skip to main content

p2panda_encryption/data_scheme/test_utils/
dgm.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2
3use 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}