1#[derive(Debug, Clone, PartialEq)]
3pub enum FilterExpression {
4 Comparison {
6 left: Box<FilterExpression>,
7 op: ComparisonOp,
8 right: Box<FilterExpression>,
9 },
10 Logical {
12 left: Box<FilterExpression>,
13 op: LogicalOp,
14 right: Box<FilterExpression>,
15 },
16 Not(Box<FilterExpression>),
18 Arithmetic {
20 left: Box<FilterExpression>,
21 op: ArithmeticOp,
22 right: Box<FilterExpression>,
23 },
24 UnaryMinus(Box<FilterExpression>),
26 FunctionCall {
28 name: String,
29 args: Vec<FilterExpression>,
30 },
31 In {
33 field: Box<FilterExpression>,
34 values: Vec<FilterExpression>,
35 },
36 Lambda {
38 collection: String,
39 operator: LambdaOp,
40 variable: String,
41 predicate: Box<FilterExpression>,
42 },
43 Field(String),
45 StringLiteral(String),
47 NumberLiteral(f64),
49 BooleanLiteral(bool),
51 Null,
53 GuidLiteral(String),
55 DateLiteral(String),
57}
58
59#[derive(Debug, Clone, PartialEq)]
61pub enum ComparisonOp {
62 Eq, Ne, Gt, Ge, Lt, Le, Has, }
70
71#[derive(Debug, Clone, PartialEq)]
73pub enum LogicalOp {
74 And, Or, }
77
78#[derive(Debug, Clone, PartialEq)]
80pub enum ArithmeticOp {
81 Add, Sub, Mul, Div, Mod, }
87
88#[derive(Debug, Clone, PartialEq)]
90pub enum LambdaOp {
91 Any, All, }
94
95#[derive(Debug, Clone, PartialEq)]
97pub enum SortDirection {
98 Asc,
99 Desc,
100}
101
102#[derive(Debug, Clone, PartialEq)]
104pub struct OrderByItem {
105 pub field: String,
106 pub direction: SortDirection,
107}
108
109impl OrderByItem {
110 pub fn new(field: String, direction: SortDirection) -> Self {
111 Self { field, direction }
112 }
113}
114
115#[derive(Debug, Clone, PartialEq)]
117pub struct ExpandItem {
118 pub field: String,
119 pub options: Option<Box<QueryOptions>>,
120 pub levels: Option<u32>,
121}
122
123impl ExpandItem {
124 pub fn new(field: String) -> Self {
125 Self {
126 field,
127 options: None,
128 levels: None,
129 }
130 }
131}
132
133#[derive(Debug, Clone, PartialEq)]
135pub struct QueryOptions {
136 pub select: Option<Vec<String>>,
137 pub top: Option<u32>,
138 pub skip: Option<u32>,
139 pub expand: Option<Vec<ExpandItem>>,
140 pub filter: Option<FilterExpression>,
141 pub orderby: Option<Vec<OrderByItem>>,
142 pub groupby: Option<Vec<String>>,
143 pub count: Option<bool>,
144 pub format: Option<String>,
145 pub id: Option<String>,
146 pub skiptoken: Option<String>,
147 pub search: Option<String>,
148}
149
150impl QueryOptions {
151 pub fn new() -> Self {
152 Self {
153 select: None,
154 top: None,
155 skip: None,
156 expand: None,
157 filter: None,
158 orderby: None,
159 groupby: None,
160 count: None,
161 format: None,
162 id: None,
163 skiptoken: None,
164 search: None,
165 }
166 }
167}
168
169impl Default for QueryOptions {
170 fn default() -> Self {
171 Self::new()
172 }
173}