tytanic_filter/eval/
value.rsuse super::{Error, Func, Set};
use crate::ast::{Num, Str};
#[derive(Debug, Clone)]
pub enum Value<T> {
Test(T),
Set(Set<T>),
Func(Func<T>),
Num(Num),
Str(Str),
}
impl<T> Value<T> {
pub fn as_type(&self) -> Type {
match self {
Value::Test(_) => Type::Test,
Value::Set(_) => Type::Set,
Value::Func(_) => Type::Func,
Value::Num(_) => Type::Num,
Value::Str(_) => Type::Str,
}
}
pub fn expect_type<V: TryFromValue<T>>(self) -> Result<V, Error>
where
T: Clone,
{
V::try_from_value(self)
}
}
impl<T> From<Set<T>> for Value<T> {
fn from(value: Set<T>) -> Self {
Self::Set(value)
}
}
impl<T> From<Func<T>> for Value<T> {
fn from(value: Func<T>) -> Self {
Self::Func(value)
}
}
impl<T> From<Num> for Value<T> {
fn from(value: Num) -> Self {
Self::Num(value)
}
}
impl<T> From<Str> for Value<T> {
fn from(value: Str) -> Self {
Self::Str(value)
}
}
pub trait TryFromValue<T>: Sized {
fn try_from_value(value: Value<T>) -> Result<Self, Error>;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Type {
Test,
Set,
Func,
Num,
Str,
}
impl Type {
pub fn name(&self) -> &'static str {
match self {
Self::Test => "test",
Self::Set => "test set",
Self::Func => "function",
Self::Num => "number",
Self::Str => "string",
}
}
}