//! Contains node definitions for Merkle trees, including leaf and internal node structures. use crate::hasher::Hasher; /// Enum representing the type of a Merkle tree node. #[derive(Debug, Clone)] pub enum NodeType { /// A leaf node that contains no children. Leaf, /// An internal node that has two children. Internal(Box, Box), } impl NodeType { /// Returns a reference to the left child if the node is internal. pub fn left(&self) -> Option<&Node> { match self { NodeType::Leaf => None, NodeType::Internal(l, _) => Some(l), } } /// Returns a reference to the right child if the node is internal. pub fn right(&self) -> Option<&Node> { match self { NodeType::Leaf => None, NodeType::Internal(_, r) => Some(r), } } } /// Represents a node in a Merkle tree, either leaf or internal. #[derive(Debug, Clone)] pub struct Node { /// Hash value stored at the node. hash: String, /// Type of the node: leaf or internal. kind: NodeType, } impl Node { /// Constructs a new leaf node from input data. /// /// # Arguments /// /// * `hasher` - A reference to a hashing strategy. /// * `data` - The data to be hashed and stored as a leaf. pub fn new_leaf(hasher: &dyn Hasher, data: T) -> Self { let hash = hasher.hash(&data.to_string()); Self { hash, kind: NodeType::Leaf, } } /// Constructs a new internal node from two child nodes. /// /// # Arguments /// /// * `hasher` - A reference to a hashing strategy. /// * `left` - Left child node. /// * `right` - Right child node. /// /// # Behavior /// /// The internal node hash is computed as the hash of the concatenated children's hashes. pub fn new_internal(hasher: &dyn Hasher, left: Node, right: Node) -> Self { let combined = format!("{}{}", left.hash, right.hash); let hash = hasher.hash(&combined); Self { hash, kind: NodeType::Internal(Box::new(left), Box::new(right)), } } /// Returns a reference to the hash of the node. pub fn hash(&self) -> &str { &self.hash } /// Returns a reference to the node's type (leaf or internal). pub fn kind(&self) -> &NodeType { &self.kind } }