postgrest_parser/ast/
params.rs1use super::{LogicCondition, OrderTerm, SelectItem};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5pub struct ParsedParams {
6 pub select: Option<Vec<SelectItem>>,
7 pub filters: Vec<LogicCondition>,
8 pub order: Vec<OrderTerm>,
9 pub limit: Option<u64>,
10 pub offset: Option<u64>,
11}
12
13impl ParsedParams {
14 pub fn new() -> Self {
15 Self {
16 select: None,
17 filters: Vec::new(),
18 order: Vec::new(),
19 limit: None,
20 offset: None,
21 }
22 }
23
24 pub fn with_select(mut self, select: Vec<SelectItem>) -> Self {
25 self.select = Some(select);
26 self
27 }
28
29 pub fn with_filters(mut self, filters: Vec<LogicCondition>) -> Self {
30 self.filters = filters;
31 self
32 }
33
34 pub fn with_order(mut self, order: Vec<OrderTerm>) -> Self {
35 self.order = order;
36 self
37 }
38
39 pub fn with_limit(mut self, limit: u64) -> Self {
40 self.limit = Some(limit);
41 self
42 }
43
44 pub fn with_offset(mut self, offset: u64) -> Self {
45 self.offset = Some(offset);
46 self
47 }
48
49 pub fn is_empty(&self) -> bool {
50 self.select.is_none()
51 && self.filters.is_empty()
52 && self.order.is_empty()
53 && self.limit.is_none()
54 && self.offset.is_none()
55 }
56
57 pub fn has_filters(&self) -> bool {
58 !self.filters.is_empty()
59 }
60
61 pub fn has_select(&self) -> bool {
62 self.select.is_some()
63 }
64}
65
66impl Default for ParsedParams {
67 fn default() -> Self {
68 Self::new()
69 }
70}
71
72#[cfg(test)]
73mod tests {
74 use super::*;
75 use crate::ast::{Field, Filter, FilterOperator, FilterValue};
76
77 #[test]
78 fn test_parsed_params_new() {
79 let params = ParsedParams::new();
80 assert!(params.select.is_none());
81 assert!(params.filters.is_empty());
82 assert!(params.order.is_empty());
83 assert!(params.limit.is_none());
84 assert!(params.offset.is_none());
85 }
86
87 #[test]
88 fn test_parsed_params_with_select() {
89 let select = vec![SelectItem::field("id"), SelectItem::field("name")];
90 let params = ParsedParams::new().with_select(select);
91 assert!(params.has_select());
92 assert_eq!(params.select.as_ref().unwrap().len(), 2);
93 }
94
95 #[test]
96 fn test_parsed_params_with_limit() {
97 let params = ParsedParams::new().with_limit(100);
98 assert_eq!(params.limit, Some(100));
99 }
100
101 #[test]
102 fn test_parsed_params_with_offset() {
103 let params = ParsedParams::new().with_offset(20);
104 assert_eq!(params.offset, Some(20));
105 }
106
107 #[test]
108 fn test_parsed_params_is_empty() {
109 let params = ParsedParams::new();
110 assert!(params.is_empty());
111 }
112
113 #[test]
114 fn test_parsed_params_has_filters() {
115 let filter = LogicCondition::Filter(Filter::new(
116 Field::new("id"),
117 FilterOperator::Eq,
118 FilterValue::Single("1".to_string()),
119 ));
120 let params = ParsedParams::new().with_filters(vec![filter]);
121 assert!(params.has_filters());
122 }
123
124 #[test]
125 fn test_parsed_params_default() {
126 let params = ParsedParams::default();
127 assert!(params.is_empty());
128 }
129
130 #[test]
131 fn test_parsed_params_serialization() {
132 let params = ParsedParams::new().with_limit(10);
133 let json = serde_json::to_string(¶ms).unwrap();
134 assert!(json.contains("limit"));
135 }
136}