rjango 0.1.1

A full-stack Rust backend framework inspired by Django
Documentation
/// Simple tree data structure for nested menus/categories.
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TreeNode<T> {
    pub value: T,
    pub children: Vec<TreeNode<T>>,
}

impl<T> TreeNode<T> {
    #[must_use]
    pub fn new(value: T) -> Self {
        Self {
            value,
            children: Vec::new(),
        }
    }

    pub fn add_child(&mut self, child: TreeNode<T>) {
        self.children.push(child);
    }

    #[must_use]
    pub fn is_leaf(&self) -> bool {
        self.children.is_empty()
    }

    #[must_use]
    pub fn depth(&self) -> usize {
        if self.children.is_empty() {
            0
        } else {
            1 + self.children.iter().map(TreeNode::depth).max().unwrap_or(0)
        }
    }
}

#[cfg(test)]
mod tests {
    use super::TreeNode;

    #[test]
    fn new_nodes_start_as_leaves() {
        let node = TreeNode::new("root");

        assert!(node.is_leaf());
        assert_eq!(node.depth(), 0);
    }

    #[test]
    fn add_child_makes_node_non_leaf() {
        let mut node = TreeNode::new("root");
        node.add_child(TreeNode::new("child"));

        assert!(!node.is_leaf());
        assert_eq!(node.children.len(), 1);
    }

    #[test]
    fn depth_tracks_longest_branch() {
        let mut root = TreeNode::new("root");
        let mut child = TreeNode::new("child");
        child.add_child(TreeNode::new("grandchild"));
        root.add_child(child);
        root.add_child(TreeNode::new("sibling"));

        assert_eq!(root.depth(), 2);
    }
}