use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum DatabaseEngine {
Postgres,
MySQL,
SQLite,
MongoDB,
}
impl DatabaseEngine {
pub const fn default_engine() -> Self {
Self::Postgres
}
pub const fn is_sql(&self) -> bool {
matches!(self, Self::Postgres | Self::MySQL | Self::SQLite)
}
pub const fn is_mongo(&self) -> bool {
matches!(self, Self::MongoDB)
}
}
impl Default for DatabaseEngine {
fn default() -> Self {
Self::default_engine()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn engine_is_sql() {
assert!(DatabaseEngine::Postgres.is_sql());
assert!(DatabaseEngine::MySQL.is_sql());
assert!(DatabaseEngine::SQLite.is_sql());
assert!(!DatabaseEngine::MongoDB.is_sql());
}
#[test]
fn engine_serde() {
let s = serde_json::to_string(&DatabaseEngine::Postgres).unwrap();
assert_eq!(s, r#""postgres""#);
let e: DatabaseEngine = serde_json::from_str(&s).unwrap();
assert_eq!(e, DatabaseEngine::Postgres);
}
#[test]
fn engine_is_mongo() {
assert!(DatabaseEngine::MongoDB.is_mongo());
assert!(!DatabaseEngine::Postgres.is_mongo());
assert!(!DatabaseEngine::MySQL.is_mongo());
assert!(!DatabaseEngine::SQLite.is_mongo());
}
#[test]
fn engine_default_is_postgres() {
assert_eq!(DatabaseEngine::default(), DatabaseEngine::Postgres);
assert_eq!(DatabaseEngine::default_engine(), DatabaseEngine::Postgres);
}
#[test]
fn all_engine_variants_serde() {
let pairs = [
(DatabaseEngine::Postgres, "postgres"),
(DatabaseEngine::MySQL, "mysql"),
(DatabaseEngine::SQLite, "sqlite"),
(DatabaseEngine::MongoDB, "mongodb"),
];
for (engine, expected_str) in pairs {
let json = serde_json::to_string(&engine).unwrap();
assert_eq!(json, format!("\"{expected_str}\""));
let back: DatabaseEngine = serde_json::from_str(&json).unwrap();
assert_eq!(back, engine);
}
}
}