derive_sql/selectable/
simpleorder.rs1use super::*;
2
3pub 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}