use crate::{binary_tree::array_representation::LeafNodeIndex, extensions::SenderExtensionIndex};
use super::*;
use tls_codec::{TlsDeserialize, TlsDeserializeBytes, TlsSerialize, TlsSize};
#[derive(
Debug,
PartialEq,
Eq,
Clone,
Serialize,
Deserialize,
TlsSerialize,
TlsDeserialize,
TlsDeserializeBytes,
TlsSize,
)]
#[repr(u8)]
pub enum Sender {
#[tls_codec(discriminant = 1)]
Member(LeafNodeIndex),
External(SenderExtensionIndex),
NewMemberProposal,
NewMemberCommit,
}
impl Sender {
pub(crate) fn from_sender_data(sender_data: MlsSenderData) -> Self {
Self::Member(sender_data.leaf_index)
}
pub(crate) fn build_member(leaf_index: LeafNodeIndex) -> Self {
Self::Member(leaf_index)
}
pub(crate) fn is_member(&self) -> bool {
matches!(self, Sender::Member(_))
}
pub(crate) fn as_member(&self) -> Option<LeafNodeIndex> {
match self {
Sender::Member(leaf_index) => Some(*leaf_index),
_ => None,
}
}
}
#[derive(Clone, TlsDeserialize, TlsDeserializeBytes, TlsSerialize, TlsSize)]
#[cfg_attr(test, derive(Debug))]
pub(crate) struct MlsSenderData {
pub(crate) leaf_index: LeafNodeIndex,
pub(crate) generation: u32,
pub(crate) reuse_guard: ReuseGuard,
}
impl MlsSenderData {
pub(crate) fn from_sender(
leaf_index: LeafNodeIndex,
generation: u32,
reuse_guard: ReuseGuard,
) -> Self {
MlsSenderData {
leaf_index,
generation,
reuse_guard,
}
}
}
#[derive(Clone, TlsDeserialize, TlsDeserializeBytes, TlsSerialize, TlsSize)]
pub(crate) struct MlsSenderDataAad {
pub(crate) group_id: GroupId,
pub(crate) epoch: GroupEpoch,
pub(crate) content_type: ContentType,
}
impl MlsSenderDataAad {
pub(crate) fn new(group_id: GroupId, epoch: GroupEpoch, content_type: ContentType) -> Self {
Self {
group_id,
epoch,
content_type,
}
}
#[cfg(test)]
pub fn test_new(group_id: GroupId, epoch: GroupEpoch, content_type: ContentType) -> Self {
Self::new(group_id, epoch, content_type)
}
}