use simd_json::OwnedValue as Value;
use super::builtins::Builtin;
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct Span {
pub start: usize,
pub end: usize,
}
impl Span {
pub fn new(start: usize, end: usize) -> Self {
Self { start, end }
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Filter {
pub kind: FilterKind,
pub span: Span,
}
impl Filter {
pub fn new(kind: FilterKind, span: Span) -> Self {
Self { kind, span }
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum ObjectKey {
Static(String), Dynamic(Box<Filter>), }
#[derive(Debug, Clone, PartialEq)]
pub enum FunctionCall {
Map(Box<Filter>),
Select(Box<Filter>),
SortBy(Box<Filter>),
GroupBy(Box<Filter>),
UniqueBy(Box<Filter>),
MinBy(Box<Filter>),
MaxBy(Box<Filter>),
Has(String), Split(String), Join(String), StartsWith(String), EndsWith(String), Contains(Box<Filter>), WithEntries(Box<Filter>), }
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum CompareOp {
Eq, Ne, Lt, Le, Gt, Ge, }
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum BoolOp {
And,
Or,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ArithOp {
Add,
Sub,
Mul,
Div,
}
#[derive(Debug, Clone, PartialEq)]
pub enum FilterKind {
Identity,
Field(String),
Index(i64),
Slice(Option<i64>, Option<i64>), Iterate,
Optional(Box<Filter>), Pipe(Box<Filter>, Box<Filter>),
Builtin(Builtin),
Function(FunctionCall), Literal(Value), Compare(Box<Filter>, CompareOp, Box<Filter>), BoolOp(Box<Filter>, BoolOp, Box<Filter>), Arith(Box<Filter>, ArithOp, Box<Filter>), Array(Vec<Filter>), Object(Vec<(ObjectKey, Filter)>), IfThenElse {
condition: Box<Filter>,
then_branch: Box<Filter>,
else_branch: Box<Filter>,
},
Alternative(Box<Filter>, Box<Filter>), }