use crate::vm::object::Object; use std::cell::RefCell; use std::fmt::{Display, Formatter}; use std::rc::Rc; #[derive(Clone, Debug, PartialEq)] pub enum Value { Int(i32), Double(f64), String(Rc), Null, } impl Default for Value { fn default() -> Value { Value::Null } } impl Value { pub fn unwrap_int(&self) -> i32 { match self { Value::Int(i) => *i, _ => panic!("Attempt to unwrap Int; found {:?}", self), } } pub fn unwrap_double(&self) -> f64 { match self { Value::Double(d) => *d, _ => panic!("Attempt to unwrap Double; found {:?}", self), } } pub fn unwrap_string(&self) -> &Rc { match self { Value::String(s) => s, _ => panic!("Attempt to unwrap String; found {:?}", self), } } pub fn unwrap_object(&self) -> &Rc> { todo!() } pub fn unwrap_object_mut(&mut self) -> &mut Rc> { todo!() } } impl Display for Value { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match self { Value::Int(i) => { write!(f, "{}", i) } Value::Double(d) => { write!(f, "{}", d) } Value::String(s) => { write!(f, "{}", s) } Value::Null => { write!(f, "Null") } } } }