use bson::{Bson, Document};
use crate::field::Field;
#[derive(Clone, Serialize)]
pub enum Order<T>
where
T: Field + Into<String>,
{
Asc,
Desc,
Nested(Sort<T>),
}
impl<T> From<Order<T>> for Bson
where
T: Field + Into<String>,
{
fn from(order: Order<T>) -> Self {
match order {
Order::Asc => Bson::Int32(1),
Order::Desc => Bson::Int32(-1),
Order::Nested(s) => Bson::Document(s.into_document()),
}
}
}
#[derive(Clone, Serialize)]
pub struct Sort<T: Field + Into<String>>(Vec<(T, Order<T>)>);
impl<T> Default for Sort<T>
where
T: Field + Into<String>,
{
fn default() -> Self {
Self::new()
}
}
impl<T: Field + Into<String>> Sort<T> {
pub fn new() -> Self {
Sort(vec![])
}
pub fn push(&mut self, field: T, order: Order<T>) -> &mut Self {
self.0.push((field, order));
self
}
pub fn into_document(self) -> Document {
let mut doc = Document::new();
for (f, o) in self.0 {
doc.insert(f, o);
}
doc
}
}