wayver's git archive


an obsidian renderer
git clone https://git.wayver.dev/sable

sable-bases/src/filter/ast.rs@main

raw
Date Commit Message Author Files + -
2026-02-23 01:55 initial mvp wayverd 139 17808 0
...

1use std::borrow::Cow;
2
3use chumsky::prelude::Spanned;
4
5#[derive(Debug, Clone, Hash, PartialEq, Eq)]
6pub struct Ident<'src>(pub Cow<'src, str>);
7
8#[derive(Debug, Clone, PartialEq)]
9pub enum Token<'src> {
10    Ident(Ident<'src>),
11
12    Bool(bool),
13    Integer(i64),
14    Decimal(f64),
15    String(Cow<'src, str>),
16    Regex(Cow<'src, str>),
17
18    Add,
19    Sub,
20    Mul,
21    Div,
22    Mod,
23
24    Equal,
25    NotEqual,
26    GreaterThan,
27    LessThan,
28    GreaterEqual,
29    LessEqual,
30
31    Not,
32
33    And,
34    Or,
35
36    ParenOpen,
37    ParenClose,
38    BracketOpen,
39    BracketClose,
40
41    Comma,
42    Period,
43}
44
45#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
46pub enum BinOp {
47    Add,
48    Sub,
49    Mul,
50    Div,
51    Mod,
52
53    Equal,
54    NotEqual,
55    GreaterThan,
56    LessThan,
57    GreaterEqual,
58    LessEqual,
59
60    And,
61    Or,
62}
63
64#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
65pub enum UnOp {
66    Not,
67
68    Plus,
69    Neg,
70}
71
72#[derive(Debug, Clone, PartialEq)]
73pub enum Expr<'src> {
74    Ident(Ident<'src>),
75
76    Bool(bool),
77    Integer(i64),
78    Decimal(f64),
79    String(Cow<'src, str>),
80    Regex(Cow<'src, str>),
81
82    Function(Box<Spanned<Self>>, Spanned<Vec<Spanned<Self>>>),
83    Method(
84        Box<Spanned<Self>>,
85        Spanned<Ident<'src>>,
86        Spanned<Vec<Spanned<Self>>>,
87    ),
88
89    Member(Box<Spanned<Self>>, Spanned<Ident<'src>>),
90    Index(Box<Spanned<Self>>, Box<Spanned<Self>>),
91
92    BinOp(Spanned<BinOp>, Box<Spanned<Self>>, Box<Spanned<Self>>),
93    UnOp(Spanned<UnOp>, Box<Spanned<Self>>),
94
95    Group(Box<Spanned<Self>>),
96}
97