use serde::{Deserialize, Serialize};
use url::Url;
#[allow(clippy::struct_excessive_bools)]
#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone)]
pub struct Database {
#[serde(default = "Database::default_driver")]
pub driver: Driver,
#[serde(default = "Database::default_path")]
pub path: String,
}
impl Default for Database {
fn default() -> Self {
Self {
driver: Self::default_driver(),
path: Self::default_path(),
}
}
}
impl Database {
fn default_driver() -> Driver {
Driver::Sqlite3
}
fn default_path() -> String {
String::from("./storage/tracker/lib/database/sqlite3.db")
}
pub fn mask_secrets(&mut self) {
match self.driver {
Driver::Sqlite3 => {
}
Driver::MySQL => {
let mut url = Url::parse(&self.path).expect("path for MySQL driver should be a valid URL");
url.set_password(Some("***")).expect("url password should be changed");
self.path = url.to_string();
}
}
}
}
#[derive(Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Debug, Hash, Clone)]
#[serde(rename_all = "lowercase")]
pub enum Driver {
Sqlite3,
MySQL,
}
#[cfg(test)]
mod tests {
use super::{Database, Driver};
#[test]
fn it_should_allow_masking_the_mysql_user_password() {
let mut database = Database {
driver: Driver::MySQL,
path: "mysql://root:password@localhost:3306/torrust".to_string(),
};
database.mask_secrets();
assert_eq!(database.path, "mysql://root:***@localhost:3306/torrust".to_string());
}
}