kosame_repr 0.2.1

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

use crate::expr::Expr;

pub struct Values<'a> {
    rows: &'a [ValuesRow<'a>],
}

impl<'a> Values<'a> {
    #[inline]
    pub const fn new(rows: &'a [ValuesRow<'a>]) -> Self {
        Self { rows }
    }

    #[inline]
    pub const fn rows(&self) -> &'a [ValuesRow<'a>] {
        self.rows
    }
}

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

pub struct ValuesRow<'a> {
    items: &'a [ValuesItem<'a>],
}

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

    #[inline]
    pub const fn items(&self) -> &'a [ValuesItem<'a>] {
        self.items
    }
}

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

pub enum ValuesItem<'a> {
    Default,
    Expr(Expr<'a>),
}

impl kosame_sql::FmtSql for ValuesItem<'_> {
    #[inline]
    fn fmt_sql<D: kosame_sql::Dialect>(
        &self,
        formatter: &mut kosame_sql::Formatter<D>,
    ) -> kosame_sql::Result {
        match self {
            Self::Default => formatter.write_str("default")?,
            Self::Expr(expr) => expr.fmt_sql(formatter)?,
        }
        Ok(())
    }
}