eldek-tad 0.9.1

A project for learning Abstract Data Types (ADTs) in Rust. Heavily inspired by Java's implementation.
Documentation
use std::fmt::{self, Debug};
use crate::binary_tree::traits::node_traits::NodeTrait;

pub struct Node<K:PartialEq, T> {
    pub key: K,
    pub value: T,
    pub left: Option<Box<Node<K, T>>>,
    pub right: Option<Box<Node<K, T>>>,
}

impl<K:PartialEq + Clone, T> NodeTrait<K, T> for Node<K, T> {
    fn new(key: K, value: T) -> Node<K, T> {
        Node { key, value, left: None, right: None }
    }

    fn find(&self, key: K) -> Option<&Node<K, T>> {
        if self.key == key {
            return Some(self);
        }

        if let Some(left) = self.left.as_ref(){
            let found = left.find(key.clone());
            if found.is_some(){
                return found;
            }
        }

        if let Some(right) = self.right.as_ref(){
            let found = right.find(key.clone());
            if found.is_some(){
                return found;
            }
        }

        return None;
    }

    fn find_mut(&mut self, key: K) -> Option<&mut Node<K, T>> {
        if self.key == key {
            return Some(self);
        }

        if let Some(left) = self.left.as_mut(){
            let found = left.find_mut(key.clone());
            if found.is_some(){
                return found;
            }
        }

        if let Some(right) = self.right.as_mut(){
            let found = right.find_mut(key.clone());
            if found.is_some(){
                return found;
            }
        }

        return None;
    }

    fn find_parent(&mut self, key: K) -> Option<&mut Node<K, T>>{
        if let Some(left) = self.left.as_ref() {
            if left.key == key {
                return Some(self);
            }
        }

        if let Some(right) = self.right.as_ref() {
            if right.key == key {
                return Some(self);
            }
        }

        if let Some(left) = self.left.as_mut() {
            if let Some(parent) = left.find_parent(key.clone()) {
                return Some(parent);
            }
        }

        if let Some(right) = self.right.as_mut() {
            return right.find_parent(key);
        }

        return None;
    }
}

impl <K: Debug + PartialEq, T:Debug> Debug for Node<K, T> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        self.fmt_with_level(f, 0)
    }
}

impl<K: Debug + PartialEq, T: Debug> Node<K,T> {
    fn fmt_with_level(&self, f: &mut fmt::Formatter<'_>, level: usize) -> fmt::Result {
        for _ in 0..level {
            write!(f, "\t")?;
        }

        writeln!(f, "\t({:?}, {:?})", self.key, self.value)?;

        if let Some(left) = &self.left {
            left.fmt_with_level(f, level + 1)?;
        }

        if let Some(right) = &self.right {
            right.fmt_with_level(f, level + 1)?;
        }

        Ok(())
    }
}