1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
//! Simple Query Language
//!
//! This is a parser which allows implementing a strongly typed, simple query syntax for custom
//! resources.
//!
//! ## Example
//!
//! Define a resource that you want to search in:
//!
//! ```rust
//! use sikula::prelude::*;
//!
//! #[derive(Search)]
//! pub enum MyResource<'a> {
//! #[search(scope, default)]
//! Subject(Primary<'a>),
//! #[search(scope)]
//! Body(Primary<'a>),
//!
//! Sender(&'a str),
//!
//! #[search(sort)]
//! Sent(Ordered<time::OffsetDateTime>),
//! #[search(sort)]
//! Size(Ordered<usize>),
//!
//! #[search(sort)]
//! Header(Qualified<'a, &'a str>),
//!
//! Read,
//! Important,
//! }
//! ```
//! Next, having your query, parse it into the enum:
//!
//! ```rust
//! use sikula::prelude::*;
//!
//! # #[derive(Search)]
//! # pub enum MyResource<'a> {
//! # #[search(scope, default)]
//! # Subject(Primary<'a>),
//! # #[search(scope)]
//! # Body(Primary<'a>),
//! #
//! # Sender(&'a str),
//! #
//! # #[search(sort)]
//! # Sent(Ordered<time::OffsetDateTime>),
//! # #[search(sort)]
//! # Size(Ordered<usize>),
//! #
//! # #[search(sort)]
//! # Header(Qualified<'a, &'a str>),
//! #
//! # Read,
//! # Important,
//! # }
//!
//! # pub type MyItem = ();
//! fn search(query: &str) -> Result<Vec<MyItem>, Error> {
//! let query = MyResource::parse(query)?;
//! Ok(perform_search(query))
//! }
//!
//! fn perform_search<'a>(query: Query<'a, MyResource<'a>>) -> Vec<MyItem> {
//! // Here you need to translate the query structure into some query for the target store
//! // (like SQL), or manually apply a filter in-memory to items. Or do a mix, whatever makes
//! // sense for your data.
//! todo!("Implement search")
//! }
//! ```
//!
//! Now, you can do the following queries:
//!
//! | Query | Retrieves all entries… |
//! |---------------------------------------------------|---------------------------------------------------------------------------------------------------|
//! | `foo` | … containing "foo" in the "subject" |
//! | `foo in:subject in:message` | … containing "foo" in either "subject" or "body" |
//! | `foo in:subject in:message is:read` | … containing "foo" in either "subject" or "body" being "read" |
//! | `foo bar` | … containing "foo" and "bar" in the subject |
//! | `size:>10000` | … having a size greater than 10000 |
//! | `size:100..200` | … having a size between 100 (inclusive) and 200 (exclusive) |
//!
//! See more examples in README.
/// High-level intermediate representation
/// Low-level intermediate representation
/// Mid-level intermediate representation
/// Basic parsing
/// Support for building SeaORM conditions
/// The prelude
/// A derive implementing the [`crate::prelude::Search`] trait.
pub use Search;
/// The chumsky version used by this crate.
pub use chumsky;