tytanic_filter/ast/
atom.rs

1use super::{Id, Num, Pat, Str};
2use crate::eval::{Context, Error, Eval, Test, Value};
3
4/// An leaf node within a test set expression such as an identifier or literal.
5#[derive(Debug, Clone, PartialEq, Eq, Hash)]
6pub enum Atom {
7    /// A variable.
8    Id(Id),
9
10    /// A number literal.
11    Num(Num),
12
13    /// A string literal.
14    Str(Str),
15
16    /// A pattern literal.
17    Pat(Pat),
18}
19
20impl<T: Test> Eval<T> for Atom {
21    fn eval(&self, ctx: &Context<T>) -> Result<Value<T>, Error> {
22        Ok(match self {
23            Self::Id(id) => id.eval(ctx)?,
24            Self::Num(n) => Value::Num(*n),
25            Self::Str(s) => Value::Str(s.clone()),
26            Self::Pat(pat) => pat.eval(ctx)?,
27        })
28    }
29}