use std::path::Path;
use std::time::Duration;
use anyhow::Ok;
use log::LevelFilter;
use super::runtime::{RunTime, RuntTimeType};
#[derive(Debug, Clone)]
pub(crate) struct DatabaseConfiguration
{
pub path: Option<String>,
pub runtime: Option<RunTime>,
pub log: Option<bool>,
pub log_level: Option<LevelFilter>,
pub default_ttl: Option<Duration>,
}
impl DatabaseConfiguration
{
pub fn new(
path: Option<String>,
runtime: Option<RunTime>,
log: Option<bool>,
log_level: Option<LevelFilter>,
default_ttl: Option<Duration>,
) -> anyhow::Result<Self>
{
let vp = match path {
Some(p) => validate_path(p.as_str()),
None => "db.qkv".to_string(),
};
let dir_path = Path::new(&vp).parent().unwrap_or_else(|| Path::new(""));
if !dir_path.exists() {
std::fs::create_dir_all(dir_path)?;
}
Ok(Self {
path: Some(vp.to_string()),
runtime,
log,
log_level,
default_ttl,
})
}
}
fn validate_path(input: &str) -> String
{
let mut result = String::from(input);
if input.ends_with('/') {
result.push_str("db.qkv");
} else if !input.contains('.') {
result.push_str(".qkv");
} else if !input.ends_with(".qkv") {
let index = input.rfind('.').unwrap_or(0);
result.replace_range(index.., ".qkv");
}
result
}
impl Default for DatabaseConfiguration
{
fn default() -> Self
{
Self {
path: Some("db.qkv".to_string()),
runtime: Some(RunTime::new(RuntTimeType::Disk)),
log: true.into(),
log_level: LevelFilter::Info.into(),
default_ttl: None,
}
}
}