use std::fmt; #[derive(Clone, PartialEq, Eq)] pub enum Val { Atom(String), List(Vec), I64(i64), String(String), } impl fmt::Debug for Val { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Val::Atom(v) => write!(f, "{v}"), Val::List(vs) => { f.write_str("(")?; for (i, v) in vs.iter().enumerate() { if i != 0 { f.write_str(" ")?; } v.fmt(f)?; } f.write_str(")")?; Ok(()) } Val::I64(v) => v.fmt(f), Val::String(s) => s.fmt(f), } } } #[cfg(test)] mod tests { use super::*; #[test] fn print_string() { assert_eq!( format!("{:?}", Val::String("Hello, World!".to_string())), "\"Hello, World!\"".to_string() ); } #[test] fn print_atom() { assert_eq!( format!("{:?}", Val::Atom("boo-guff".to_string())), "boo-guff".to_string() ); } #[test] fn print_i64() { assert_eq!( format!("{:?}", Val::I64(1234)), "1234".to_string() ); } #[test] fn print_list() { assert_eq!( format!("{:?}", Val::List(vec!(Val::Atom("a".to_string()), Val::Atom("b".to_string())))), "(a b)".to_string() ); } }