p2panda_auth/group/
member.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2
3#[cfg(any(test, feature = "serde"))]
4use serde::{Deserialize, Serialize};
5
6use crate::traits::IdentityHandle;
7
8/// A group member which can be a single individual or another group.
9///
10/// The `Group` variant can be used to express nested group relations. In both cases, the member
11/// identifier is the same generic ID.
12#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
13#[cfg_attr(any(test, feature = "serde"), derive(Deserialize, Serialize))]
14pub enum GroupMember<ID> {
15    Individual(ID),
16    Group(ID),
17}
18
19impl<ID> GroupMember<ID>
20where
21    ID: Copy,
22{
23    /// Return the ID of a group member.
24    pub fn id(&self) -> ID {
25        match self {
26            GroupMember::Individual(id) => *id,
27            GroupMember::Group(id) => *id,
28        }
29    }
30
31    /// Return true if this group member is itself a group.
32    pub fn is_group(&self) -> bool {
33        match self {
34            GroupMember::Individual(_) => false,
35            GroupMember::Group(_) => true,
36        }
37    }
38
39    /// Return true if this group member is an individual.
40    pub fn is_individual(&self) -> bool {
41        !self.is_group()
42    }
43}
44
45impl<ID> IdentityHandle for GroupMember<ID> where ID: IdentityHandle {}