postgrest_query_parser/
lib.rs

1#![warn(clippy::all, clippy::pedantic)]
2//!
3//! Note that not all operators are implemented, you get an `Error::OperatorNotImplemented` error when this happens.
4//!
5//! ## example
6//!
7//! ```rust
8//! use postgrest_query_parser::{Ast, Lexer};
9//! use postgrest_query_parser::ast::{
10//!     Field, FieldKey, Filter, FilterPath, InnerFilter, Order, OrderItem, Select,
11//! };
12//! use postgrest_query_parser::ast::filter;
13//! use postgrest_query_parser::ast::order;
14//!
15//! let input = "id=gte.14&order=id.asc&select=id&id=lt.54";
16//! let lexer = Lexer::new(input.chars());
17//! let expected = Ast {
18//!     select: Some(Select {
19//!         fields: vec![Field::Key(FieldKey {
20//!             column: "id".to_string(),
21//!             alias: None,
22//!         })],
23//!     }),
24//!     order: Some(Order {
25//!         fields: vec![OrderItem {
26//!             field: "id".to_string(),
27//!             operator: order::Operator::Asc,
28//!             nulls_position: None,
29//!         }],
30//!     }),
31//!     filter: vec![
32//!         Filter::One(InnerFilter {
33//!             path: FilterPath::Leaf("id".to_string()),
34//!             operator: filter::Operator::GreaterThanEqual,
35//!             value: "14".to_string(),
36//!         }),
37//!         Filter::One(InnerFilter {
38//!             path: FilterPath::Leaf("id".to_string()),
39//!             operator: filter::Operator::LessThan,
40//!             value: "54".to_string(),
41//!         }),
42//!     ],
43//!     ..Default::default()
44//! };
45//! let out = Ast::from_lexer(input, lexer).unwrap();
46//!
47//! assert_eq!(expected, out);
48//! ```
49//!
50//! You can use the Lexer directly to build the ast yourself. See example below or check the tests.
51//!
52//! ```rust
53//! use postgrest_query_parser::Lexer;
54//! use postgrest_query_parser::lexer::{Span, SpanType};
55//!
56//! let input = "id=gte.14&order=id.asc&select=id&id=lt.54";
57//! let lexer = Lexer::new(input.chars());
58//! let tokens: Vec<_> = lexer.collect();
59//! let expected = vec![
60//!     Span {
61//!         span_type: SpanType::String,
62//!         range: 0..2,
63//!     },
64//!     Span {
65//!         span_type: SpanType::Equal,
66//!         range: 2..3,
67//!     },
68//!     Span {
69//!         span_type: SpanType::String,
70//!         range: 3..6,
71//!     },
72//!     Span {
73//!         span_type: SpanType::PathSeparator,
74//!         range: 6..7,
75//!     },
76//!     Span {
77//!         span_type: SpanType::String,
78//!         range: 7..9,
79//!     },
80//!     Span {
81//!         span_type: SpanType::And,
82//!         range: 9..10,
83//!     },
84//!     Span {
85//!         span_type: SpanType::String,
86//!         range: 10..15,
87//!     },
88//!     Span {
89//!         span_type: SpanType::Equal,
90//!         range: 15..16,
91//!     },
92//!     Span {
93//!         span_type: SpanType::String,
94//!         range: 16..18,
95//!     },
96//!     Span {
97//!         span_type: SpanType::PathSeparator,
98//!         range: 18..19,
99//!     },
100//!     Span {
101//!         span_type: SpanType::String,
102//!         range: 19..22,
103//!     },
104//!     Span {
105//!         span_type: SpanType::And,
106//!         range: 22..23,
107//!     },
108//!     Span {
109//!         span_type: SpanType::String,
110//!         range: 23..29,
111//!     },
112//!     Span {
113//!         span_type: SpanType::Equal,
114//!         range: 29..30,
115//!     },
116//!     Span {
117//!         span_type: SpanType::String,
118//!         range: 30..32,
119//!     },
120//!     Span {
121//!         span_type: SpanType::And,
122//!         range: 32..33,
123//!     },
124//!     Span {
125//!         span_type: SpanType::String,
126//!         range: 33..35,
127//!     },
128//!     Span {
129//!         span_type: SpanType::Equal,
130//!         range: 35..36,
131//!     },
132//!     Span {
133//!         span_type: SpanType::String,
134//!         range: 36..38,
135//!     },
136//!     Span {
137//!         span_type: SpanType::PathSeparator,
138//!         range: 38..39,
139//!     },
140//!     Span {
141//!         span_type: SpanType::String,
142//!         range: 39..41,
143//!     },
144//! ];
145//!
146//! assert_eq!(tokens, expected);
147//! ```
148//!
149
150pub mod ast;
151pub mod error;
152pub mod lexer;
153
154pub use ast::Ast;
155pub use error::Error;
156pub use lexer::Lexer;