use serde::{Serialize, Serializer};
#[derive(Copy, Clone, Serialize)]
pub enum Ordering {
Ascending = -1,
Descending = 1,
}
pub struct Sort {
field: Option<String>,
order: Option<Ordering>,
}
impl Sort {
pub fn new() -> Self {
Default::default()
}
pub fn is_emtpy(&self) -> bool {
self.field.is_none() || self.order.is_none()
}
}
pub trait Sortable {
fn sort(&mut self, field: &str, order: Ordering) -> &mut Self;
}
impl<S: AsMut<Sort>> Sortable for S {
fn sort(&mut self, field: &str, order: Ordering) -> &mut Self {
self.as_mut().field = Some(field.to_owned());
self.as_mut().order = Some(order);
self
}
}
impl Default for Sort {
fn default() -> Self {
Self {
field: None,
order: None,
}
}
}
impl Serialize for Sort {
fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where
S: Serializer,
{
match (&self.field, self.order) {
(Some(field), Some(order)) => {
serializer.serialize_str(&format!("{}:{}", field, order as i8))
}
_ => serializer.serialize_none(),
}
}
}