use std::fmt;
use crate::haystack::val::Value;
#[derive(PartialEq, PartialOrd, Eq, Ord, Hash, Clone, Debug, Default)]
pub struct Symbol {
pub value: String,
}
impl Symbol {
pub fn make(val: &str) -> Self {
Symbol { value: val.into() }
}
}
impl From<&str> for Symbol {
fn from(value: &str) -> Self {
Symbol {
value: String::from(value),
}
}
}
impl From<Symbol> for Value {
fn from(value: Symbol) -> Self {
Value::Symbol(value)
}
}
impl TryFrom<&Value> for Symbol {
type Error = &'static str;
fn try_from(value: &Value) -> Result<Self, Self::Error> {
match value {
Value::Symbol(v) => Ok(v.clone()),
_ => Err("Value is not an `Symbol`"),
}
}
}
impl fmt::Display for Symbol {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "^{}", self.value)
}
}