use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize, Clone)]
#[serde(deny_unknown_fields)]
pub struct DatabaseConfig {
pub host: String,
pub port: u16,
pub storage_path: String,
pub max_sessions: usize,
}
impl Default for DatabaseConfig {
fn default() -> Self {
Self {
host: "127.0.0.1".to_string(),
port: 9758,
storage_path: "data/linkrs".to_string(),
max_sessions: 100,
}
}
}
impl DatabaseConfig {
pub fn validate(&self) -> Result<(), String> {
if self.port == 0 {
return Err("Database port cannot be 0".to_string());
}
if self.max_sessions == 0 {
return Err("Max sessions must be greater than 0".to_string());
}
if self.storage_path.is_empty() {
return Err("Storage path cannot be empty".to_string());
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_database_config_default() {
let config = DatabaseConfig::default();
assert_eq!(config.host, "127.0.0.1");
assert_eq!(config.port, 9758);
assert_eq!(config.storage_path, "data/linkrs");
assert_eq!(config.max_sessions, 100);
}
#[test]
fn test_database_config_validate() {
let config = DatabaseConfig::default();
assert!(config.validate().is_ok());
let invalid_config = DatabaseConfig {
port: 0,
..Default::default()
};
assert!(invalid_config.validate().is_err());
let invalid_config = DatabaseConfig {
max_sessions: 0,
..Default::default()
};
assert!(invalid_config.validate().is_err());
}
}