Skip to main content

rs_zero/core/dependency_config/
database.rs

1use serde::Deserialize;
2
3/// Serializable database configuration used by model repositories.
4#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
5#[serde(default, deny_unknown_fields)]
6pub struct DatabaseSection {
7    pub kind: DatabaseKindSection,
8    pub url: String,
9    pub max_connections: u32,
10    pub connect_timeout_ms: u64,
11}
12
13impl Default for DatabaseSection {
14    fn default() -> Self {
15        Self {
16            kind: DatabaseKindSection::Sqlite,
17            url: "sqlite::memory:".to_string(),
18            max_connections: 5,
19            connect_timeout_ms: 5000,
20        }
21    }
22}
23
24impl DatabaseSection {
25    /// Converts this section into the runtime database config.
26    #[cfg(feature = "db")]
27    pub fn to_database_config(&self) -> crate::db::DatabaseConfig {
28        crate::db::DatabaseConfig {
29            kind: match self.kind {
30                DatabaseKindSection::Sqlite => crate::db::DatabaseKind::Sqlite,
31                DatabaseKindSection::Postgres => crate::db::DatabaseKind::Postgres,
32                DatabaseKindSection::Mysql => crate::db::DatabaseKind::Mysql,
33            },
34            url: self.url.clone(),
35            max_connections: self.max_connections,
36            connect_timeout: std::time::Duration::from_millis(self.connect_timeout_ms),
37        }
38    }
39}
40
41/// Serializable database kind.
42#[derive(Debug, Clone, Copy, Deserialize, PartialEq, Eq, Default)]
43#[serde(rename_all = "snake_case")]
44pub enum DatabaseKindSection {
45    /// SQLite.
46    #[default]
47    Sqlite,
48    /// PostgreSQL.
49    Postgres,
50    /// MySQL.
51    Mysql,
52}