Skip to main content

prodigy/cook/execution/expression/
ast.rs

1//! Abstract Syntax Tree types for expression parsing
2//!
3//! This module defines the AST types used to represent parsed expressions.
4//! These types are data-only and separate from parsing logic.
5
6use serde_json::Value;
7
8/// Parsed expression AST
9#[derive(Debug, Clone, PartialEq)]
10pub enum Expression {
11    // Literals
12    Number(f64),
13    String(String),
14    Boolean(bool),
15    Null,
16
17    // Field access
18    Field(Vec<String>), // JSONPath segments (e.g., ["user", "profile", "name"])
19    Index(Box<Expression>, Box<Expression>), // Array/object index
20    ArrayWildcard(Box<Expression>, Vec<String>), // Array wildcard access (e.g., items[*].score)
21
22    // Comparison operators
23    Equal(Box<Expression>, Box<Expression>),
24    NotEqual(Box<Expression>, Box<Expression>),
25    GreaterThan(Box<Expression>, Box<Expression>),
26    LessThan(Box<Expression>, Box<Expression>),
27    GreaterEqual(Box<Expression>, Box<Expression>),
28    LessEqual(Box<Expression>, Box<Expression>),
29
30    // Logical operators
31    And(Box<Expression>, Box<Expression>),
32    Or(Box<Expression>, Box<Expression>),
33    Not(Box<Expression>),
34
35    // String functions
36    Contains(Box<Expression>, Box<Expression>),
37    StartsWith(Box<Expression>, Box<Expression>),
38    EndsWith(Box<Expression>, Box<Expression>),
39    Matches(Box<Expression>, Box<Expression>), // Regex match
40
41    // Type checking
42    IsNull(Box<Expression>),
43    IsNotNull(Box<Expression>),
44    IsNumber(Box<Expression>),
45    IsString(Box<Expression>),
46    IsBool(Box<Expression>),
47    IsArray(Box<Expression>),
48    IsObject(Box<Expression>),
49
50    // Aggregate functions
51    Length(Box<Expression>),
52    Sum(Box<Expression>),
53    Count(Box<Expression>),
54    Min(Box<Expression>),
55    Max(Box<Expression>),
56    Avg(Box<Expression>),
57
58    // Array operations
59    In(Box<Expression>, Vec<Value>), // Check if value is in list
60
61    // Special variables
62    Variable(String), // _index, _key, _value
63}
64
65/// Sort key with direction and null handling
66#[derive(Debug, Clone)]
67pub struct SortKey {
68    pub expression: Expression,
69    pub direction: SortDirection,
70    pub null_handling: NullHandling,
71}
72
73/// Sort direction
74#[derive(Debug, Clone, PartialEq)]
75pub enum SortDirection {
76    Ascending,
77    Descending,
78}
79
80/// Null handling strategy for sorting
81#[derive(Debug, Clone, PartialEq)]
82pub enum NullHandling {
83    First,
84    Last,
85}