derive_sql/selectable/
filter.rs

1use super::*;
2
3// mod operator; pub use operator::Operator;
4pub mod generic; // pub use equal::Equal;
5pub 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
47/*
48pub trait Filterable {
49  fn filter(&self) -> Option<String>;
50  fn next(&self) -> &Option<Box<dyn Selectable>>;
51  fn and(self, next: Box<dyn Selectable>) -> Self;
52}
53*/
54
55impl<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