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;