firestore/fluent_api/
select_order_builder.rs1use crate::{FirestoreQueryDirection, FirestoreQueryOrder};
12
13pub struct FirestoreQueryOrderBuilder {}
15
16impl FirestoreQueryOrderBuilder {
17 pub(crate) fn new() -> Self {
18 Self {}
19 }
20
21 #[inline]
25 pub fn fields<I>(&self, order_field_expr: I) -> Vec<FirestoreQueryOrder>
26 where
27 I: IntoIterator,
28 I::Item: FirestoreQueryOrderExpr,
29 {
30 order_field_expr
31 .into_iter()
32 .filter_map(|order| order.build_order())
33 .collect()
34 }
35
36 #[inline]
38 pub fn field<S>(&self, field_name: S) -> FirestoreQueryOrderFieldExpr
39 where
40 S: AsRef<str>,
41 {
42 FirestoreQueryOrderFieldExpr::new(field_name.as_ref().to_string())
43 }
44}
45
46pub trait FirestoreQueryOrderExpr {
51 fn build_order(self) -> Option<FirestoreQueryOrder>;
54}
55
56pub struct FirestoreQueryOrderFieldExpr {
60 field_name: String,
61}
62
63impl FirestoreQueryOrderFieldExpr {
64 pub(crate) fn new(field_name: String) -> Self {
65 Self { field_name }
66 }
67
68 #[inline]
71 pub fn asc(self) -> Option<FirestoreQueryOrder> {
72 self.ascending()
73 }
74
75 #[inline]
78 pub fn desc(self) -> Option<FirestoreQueryOrder> {
79 self.descending()
80 }
81
82 #[inline]
84 pub fn ascending(self) -> Option<FirestoreQueryOrder> {
85 self.direction(FirestoreQueryDirection::Ascending)
86 }
87
88 #[inline]
90 pub fn descending(self) -> Option<FirestoreQueryOrder> {
91 self.direction(FirestoreQueryDirection::Descending)
92 }
93
94 #[inline]
96 pub fn direction(self, direction: FirestoreQueryDirection) -> Option<FirestoreQueryOrder> {
97 Some(FirestoreQueryOrder::new(self.field_name, direction))
98 }
99}
100
101impl FirestoreQueryOrderExpr for FirestoreQueryOrder {
102 #[inline]
103 fn build_order(self) -> Option<FirestoreQueryOrder> {
104 Some(self)
105 }
106}
107
108impl<F> FirestoreQueryOrderExpr for Option<F>
111where
112 F: FirestoreQueryOrderExpr,
113{
114 #[inline]
115 fn build_order(self) -> Option<FirestoreQueryOrder> {
116 self.and_then(|expr| expr.build_order())
117 }
118}