1
2use serde::Deserialize;
3use serde_json::Value;
4
5#[derive(Debug, Deserialize)]
8pub struct QueryParams {
9 pub filter: Option<FilterExpr>,
11 pub group_by: Option<Vec<String>>,
13 pub having: Option<FilterExpr>,
15 pub sort: Vec<SortItem>,
17 pub page: u32,
19 pub page_size: u32,
21}
22
23#[derive(Debug, Deserialize)]
26#[serde(untagged)]
27pub enum FilterExpr {
28 And { and: Vec<FilterExpr> },
30 Or { or: Vec<FilterExpr> },
32 Cond(FilterCond),
34}
35
36#[derive(Debug, Deserialize)]
38pub struct FilterCond {
39 pub field: Option<String>,
41 pub op: Op,
43 pub value: Option<Value>,
45}
46
47#[derive(Debug, Deserialize)]
49#[serde(rename_all = "snake_case")]
50pub enum Op {
51 Eq,
53 Ne,
55 Like,
57 Gt,
59 Lt,
61 Gte,
63 Lte,
65 In,
67 NotIn,
69 Between,
71 FindInSet,
73 JsonContains,
75 IsNull,
77 IsNotNull,
79 Exists,
81 NotExists,
83}
84
85#[derive(Debug, Deserialize)]
87pub struct SortItem {
88 pub field: String,
90 pub desc: bool,
92}
93
94#[derive(Debug, Deserialize)]
96pub struct ExistsValue {
97 pub sql: String,
99 pub bind: Option<Vec<Value>>,
101}