welds 0.5.0

An async ORM for (postgres, mssql, mysql, sqlite)
Documentation
use crate::Syntax;

pub struct CountWriter {
    syntax: Syntax,
}

impl CountWriter {
    pub fn new(syntax: Syntax) -> Self {
        Self { syntax }
    }
    pub fn count(&self, prefix: Option<&str>, x: Option<&str>) -> String {
        match self.syntax {
            Syntax::Mysql => MySql::count(prefix, x),
            Syntax::Postgres => Postgres::count(prefix, x),
            Syntax::Sqlite => Sqlite::count(prefix, x),
            Syntax::Mssql => Mssql::count(prefix, x),
        }
    }
}

struct Postgres;
impl Postgres {
    fn count(prefix: Option<&str>, x: Option<&str>) -> String {
        let mut x = x.unwrap_or("*").to_owned();
        if let Some(prefix) = prefix {
            x = format!("{}.{}", prefix, x);
        }
        format!("CAST( COUNT({}) as BIGINT )", x)
    }
}

struct Sqlite;
impl Sqlite {
    fn count(_prefix: Option<&str>, x: Option<&str>) -> String {
        let x = x.unwrap_or("*");
        format!("CAST( COUNT({}) as BIGINT )", x)
    }
}

struct Mssql;
impl Mssql {
    fn count(_prefix: Option<&str>, x: Option<&str>) -> String {
        let x = x.unwrap_or("*");
        format!("CAST( COUNT({}) as BIGINT )", x)
    }
}

struct MySql;
impl MySql {
    fn count(_prefix: Option<&str>, x: Option<&str>) -> String {
        let x = x.unwrap_or("*");
        format!("COUNT({})", x)
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn pg_should_counts() {
        let w = CountWriter::new(Syntax::Postgres);
        assert_eq!(w.count(None, None), "CAST( COUNT(*) as BIGINT )");
        assert_eq!(
            w.count(None, Some("sheep")),
            "CAST( COUNT(sheep) as BIGINT )"
        );
        assert_eq!(
            w.count(Some("t1"), Some("sheep")),
            "CAST( COUNT(t1.sheep) as BIGINT )"
        );
    }
}