kosame_repr 0.2.1

Macro-based Rust ORM focused on developer ergonomics
Documentation
use std::fmt::Write;

use crate::expr::Expr;

pub struct OrderBy<'a> {
    items: &'a [OrderByItem<'a>],
}

impl<'a> OrderBy<'a> {
    #[inline]
    pub const fn new(items: &'a [OrderByItem]) -> Self {
        Self { items }
    }
}

impl kosame_sql::FmtSql for OrderBy<'_> {
    #[inline]
    fn fmt_sql<D: kosame_sql::Dialect>(
        &self,
        formatter: &mut kosame_sql::Formatter<D>,
    ) -> kosame_sql::Result {
        formatter.write_str(" order by ")?;
        for (index, item) in self.items.iter().enumerate() {
            item.fmt_sql(formatter)?;
            if index != self.items.len() - 1 {
                formatter.write_str(", ")?;
            }
        }
        Ok(())
    }
}

pub struct OrderByItem<'a> {
    expr: Expr<'a>,
    dir: Option<OrderByDir>,
    nulls: Option<OrderByNulls>,
}

impl<'a> OrderByItem<'a> {
    #[inline]
    pub const fn new(expr: Expr<'a>, dir: Option<OrderByDir>, nulls: Option<OrderByNulls>) -> Self {
        Self { expr, dir, nulls }
    }
}

impl kosame_sql::FmtSql for OrderByItem<'_> {
    #[inline]
    fn fmt_sql<D: kosame_sql::Dialect>(
        &self,
        formatter: &mut kosame_sql::Formatter<D>,
    ) -> kosame_sql::Result {
        self.expr.fmt_sql(formatter)?;
        match self.dir {
            Some(OrderByDir::Asc) => formatter.write_str(" asc")?,
            Some(OrderByDir::Desc) => formatter.write_str(" desc")?,
            None => {}
        }
        match self.nulls {
            Some(OrderByNulls::First) => formatter.write_str(" nulls first")?,
            Some(OrderByNulls::Last) => formatter.write_str(" nulls last")?,
            None => {}
        }
        Ok(())
    }
}

pub enum OrderByDir {
    Asc,
    Desc,
}

pub enum OrderByNulls {
    First,
    Last,
}