use std::rc::Rc; use super::{Node, NodeEnum, Precedence, constant::Constant}; #[derive(Clone, Debug, PartialEq, PartialOrd)] pub struct Divide { left: Rc, right: Rc, } impl Node for Divide { fn evaluate(&self, env: &mut super::Environment) -> Result, String> { let evaluated_left = self.left.evaluate(env)?; let evaluated_right = self.right.evaluate(env)?; match (evaluated_left.as_ref(), evaluated_right.as_ref()) { (NodeEnum::Constant(a), NodeEnum::Constant(b)) => { Ok(Rc::new(Constant::new(a.get_value() / b.get_value()).into())) } _ => Err(format!("Invalid Divide operation: {:?}", self)), } } fn as_string(&self, env: Option<&super::Environment>) -> String { let left_string = if self.left.precedence() <= self.precedence() { format!("({})", self.left.as_string(env)) } else { self.left.as_string(env) }; let right_string = if self.right.precedence() <= self.precedence() { format!("({})", self.right.as_string(env)) } else { self.right.as_string(env) }; format!("{}/{}", left_string, right_string) } fn precedence(&self) -> Precedence { Precedence::Factor } } impl Divide { pub fn new(left: NodeEnum, right: NodeEnum) -> Self { Self { left: Rc::new(left), right: Rc::new(right), } } }