use serde::{Deserialize, Serialize};
use tls_codec::{TlsDeserialize, TlsDeserializeBytes, TlsSerialize, TlsSize};
use self::{leaf_node::LeafNodeIn, parent_node::ParentNode};
use super::LeafNode;
mod codec;
pub(crate) mod encryption_keys;
pub(crate) mod leaf_node;
pub(crate) mod parent_node;
#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize, TlsSize, TlsSerialize)]
#[repr(u8)]
pub enum Node {
#[tls_codec(discriminant = 1)]
LeafNode(Box<LeafNode>),
#[tls_codec(discriminant = 2)]
ParentNode(Box<ParentNode>),
}
impl Node {
pub(crate) fn leaf_node(leaf: LeafNode) -> Self {
Self::LeafNode(Box::new(leaf))
}
pub(crate) fn parent_node(parent: ParentNode) -> Self {
Self::ParentNode(Box::new(parent))
}
}
#[derive(
Debug,
PartialEq,
Eq,
Clone,
Serialize,
Deserialize,
TlsSize,
TlsDeserialize,
TlsDeserializeBytes,
TlsSerialize,
)]
#[repr(u8)]
pub enum NodeIn {
#[tls_codec(discriminant = 1)]
LeafNode(Box<LeafNodeIn>),
#[tls_codec(discriminant = 2)]
ParentNode(Box<ParentNode>),
}
impl From<Node> for NodeIn {
fn from(node: Node) -> Self {
match node {
Node::LeafNode(leaf_node) => NodeIn::LeafNode(Box::new((*leaf_node).into())),
Node::ParentNode(parent_node) => NodeIn::ParentNode(parent_node),
}
}
}
#[cfg(any(feature = "test-utils", test))]
impl From<NodeIn> for Node {
fn from(node: NodeIn) -> Self {
match node {
NodeIn::LeafNode(leaf_node) => Node::LeafNode(Box::new((*leaf_node).into())),
NodeIn::ParentNode(parent_node) => Node::ParentNode(parent_node),
}
}
}
pub(crate) enum NodeReference<'a> {
Leaf(&'a LeafNode),
Parent(&'a ParentNode),
}