derive_sql/selectable/
simpleorder.rs

1use super::*;
2
3/// Nominate whether the order is ascending (ie A to Z) or descending (ie Z to A)
4pub enum Order {
5  Ascending,
6  Descending,
7}
8
9pub struct SimpleOrder {
10  order: Option<(String, Order)>,
11  next: Option<Box<dyn Selectable>>,
12}
13
14impl SimpleOrder {
15  pub fn and(mut self, next: Box<dyn Selectable>) -> SimpleOrder { self.next = Some(next); self }
16}
17
18impl Selectable for SimpleOrder {
19  fn filter(&self) -> Option<String> { self.next.as_ref().and_then(|n| n.filter()) }
20  fn limit(&self) -> Option<usize>   { self.next.as_ref().and_then(|n| n.limit()) }
21  fn offset(&self) -> Option<usize>  { self.next.as_ref().and_then(|n| n.offset()) }
22  fn order_by(&self) -> Option<String> {
23    self.order.as_ref()
24    .map(|(k, o)|
25      match o {
26        Order::Ascending  => format!("`{k}` ASC"),
27        Order::Descending => format!("`{k}` DESC"),
28      }
29    )
30  }
31}
32
33impl std::convert::TryFrom<()> for SimpleOrder {
34  type Error = Box<dyn std::error::Error>;
35  fn try_from(_: ()) -> std::result::Result<Self, Self::Error> {
36    Ok(SimpleOrder { order: None, next: None })
37  }
38}
39
40impl std::convert::TryFrom<(&str, Order)> for SimpleOrder {
41  type Error = Box<dyn std::error::Error>;
42  fn try_from((key, order): (&str, Order)) -> std::result::Result<Self, Self::Error> {
43    Ok(SimpleOrder { order: Some((key.to_string(), order)), next: None })
44  }
45}
46
47impl std::convert::TryFrom<(String, Order)> for SimpleOrder {
48  type Error = Box<dyn std::error::Error>;
49  fn try_from((key, order): (String, Order)) -> std::result::Result<Self, Self::Error> {
50    Ok(SimpleOrder { order: Some((key, order)), next: None })
51  }
52}