sqlxo 0.9.1

sqlxo: small SQL query builder + derives for filterable ORM-ish patterns
Documentation
use sqlxo_traits::Sortable;

#[macro_export]
macro_rules! order_by {
    ( $( $e:expr ),+ $(,)? ) => {{
        let mut v = ::std::vec::Vec::new();
        $(
            v.extend($e.into_iter());
        )+
        <$crate::blocks::SortOrder<_> as ::core::convert::From<::std::vec::Vec<_>>>
            ::from(v)
    }};
    () => {
        <$crate::blocks::SortOrder<_> as ::core::convert::From<::std::vec::Vec<_>>>
            ::from(::std::vec::Vec::new())
    };
}

#[derive(PartialEq, Debug, Clone)]
pub struct SortOrder<T: Sortable>(pub Vec<T>);

impl<T> SortOrder<T>
where
	T: Sortable,
{
	pub fn to_sql(&self) -> String {
		let mut out = String::new();

		for (i, s) in self.0.iter().enumerate() {
			if i > 0 {
				out.push_str(", ");
			}
			out.push_str(&s.sort_clause());
		}

		out
	}
}

impl<T: Sortable> From<Vec<T>> for SortOrder<T> {
	fn from(v: Vec<T>) -> Self {
		Self(v)
	}
}

impl<T: Sortable> From<SortOrder<T>> for Vec<T> {
	fn from(value: SortOrder<T>) -> Self {
		value.0
	}
}

impl<T: Sortable> std::iter::IntoIterator for SortOrder<T> {
	type Item = T;
	type IntoIter = ::std::vec::IntoIter<T>;

	fn into_iter(self) -> Self::IntoIter {
		self.0.into_iter()
	}
}