use crate::{ConfigManager, Result};
use serde::de::DeserializeOwned;
#[derive(Clone)]
pub struct ConfigService {
manager: ConfigManager,
}
impl ConfigService {
pub fn new() -> Self {
Self {
manager: ConfigManager::new(),
}
}
pub fn from_manager(manager: ConfigManager) -> Self {
Self { manager }
}
pub fn builder() -> ConfigServiceBuilder {
ConfigServiceBuilder::new()
}
pub fn get<T: DeserializeOwned>(&self, key: &str) -> Result<T> {
self.manager.get(key)
}
pub fn get_or<T: DeserializeOwned>(&self, key: &str, default: T) -> T {
self.manager.get_or(key, default)
}
pub fn get_string(&self, key: &str) -> Result<String> {
self.manager.get_string(key)
}
pub fn get_int(&self, key: &str) -> Result<i64> {
self.manager.get_int(key)
}
pub fn get_bool(&self, key: &str) -> Result<bool> {
self.manager.get_bool(key)
}
pub fn has(&self, key: &str) -> bool {
self.manager.has(key)
}
pub fn manager(&self) -> &ConfigManager {
&self.manager
}
}
impl Default for ConfigService {
fn default() -> Self {
Self::new()
}
}
pub struct ConfigServiceBuilder {
manager: ConfigManager,
load_env: bool,
load_dotenv: bool,
dotenv_path: Option<String>,
config_files: Vec<(String, crate::FileFormat)>,
}
impl ConfigServiceBuilder {
pub fn new() -> Self {
Self {
manager: ConfigManager::new(),
load_env: false,
load_dotenv: false,
dotenv_path: None,
config_files: Vec::new(),
}
}
pub fn with_prefix(mut self, prefix: String) -> Self {
self.manager = ConfigManager::with_prefix(prefix);
self
}
pub fn load_env(mut self) -> Self {
self.load_env = true;
self
}
pub fn load_dotenv(mut self, path: Option<String>) -> Self {
self.load_dotenv = true;
self.dotenv_path = path;
self
}
pub fn add_file(mut self, path: String, format: crate::FileFormat) -> Self {
self.config_files.push((path, format));
self
}
pub fn build(self) -> Result<ConfigService> {
if self.load_dotenv {
let _ = self.manager.load_dotenv(self.dotenv_path.as_deref());
}
if self.load_env {
self.manager.load_env()?;
}
for (path, format) in self.config_files {
self.manager.load_file(&path, format)?;
}
Ok(ConfigService::from_manager(self.manager))
}
}
impl Default for ConfigServiceBuilder {
fn default() -> Self {
Self::new()
}
}