derive_sql/selectable/
filter.rs1use super::*;
2
3pub mod generic; pub use generic::{Operator, Filter};
6mod and; pub use and::And;
7mod or; pub use or::Or;
8
9pub trait FilterTrait {
10 fn filter(&self) -> String;
11}
12
13pub struct Filterable<T>
14where T: FilterTrait
15{
16 filter: Option<T>,
17 next: Option<Box<dyn Selectable>>,
18}
19
20impl<T> std::convert::From<()> for Filterable<T>
21where T: FilterTrait
22{
23 fn from(_: ()) -> Self {
24 Filterable { filter: None, next: None }
25 }
26}
27
28impl<T> std::convert::From<T> for Filterable<T>
29where T: FilterTrait
30{
31 fn from(v: T) -> Self {
32 Filterable { filter: Some(v), next: None }
33 }
34}
35
36impl<T> Filterable<T>
37where T: FilterTrait
38{
39 pub fn and(mut self, next: Box<dyn Selectable>) -> Filterable<T> {
40 self.next = Some(next);
41 self
42 }
43
44 pub fn next(&self) -> &Option<Box<dyn Selectable>> { &self.next }
45}
46
47impl<T> Selectable for Filterable<T>
56where T: FilterTrait
57{
58 fn filter(&self) -> Option<String> {
59 self.filter.as_ref().map(|f| f.filter())
60 }
61
62 fn limit(&self) -> Option<usize> { self.next.as_ref().and_then(|n| n.limit()) }
63 fn offset(&self) -> Option<usize> { self.next.as_ref().and_then(|n| n.offset()) }
64 fn order_by(&self) -> Option<String> { self.next.as_ref().and_then(|n| n.order_by()) }
65}
66