use crate::extension::ConfigExtension;
use serde_json::Value;
use std::collections::BTreeMap;
use std::path::PathBuf;
pub struct Config {
pub(crate) scale: f64,
pub(crate) datastore_path: Option<PathBuf>,
pub(crate) base_path: Option<PathBuf>,
pub(crate) aisle_path: Option<PathBuf>,
pub(crate) pantry_path: Option<PathBuf>,
pub(crate) extensions: Vec<Box<dyn ConfigExtension>>,
pub(crate) extra_context: BTreeMap<String, Value>,
}
impl Default for Config {
fn default() -> Self {
Self {
scale: 1.0,
datastore_path: None,
base_path: std::env::current_dir().ok(),
aisle_path: None,
pantry_path: None,
extensions: Vec::new(),
extra_context: BTreeMap::new(),
}
}
}
impl Config {
#[must_use]
pub fn builder() -> ConfigBuilder {
ConfigBuilder::default()
}
#[must_use]
pub fn with_extension<E: ConfigExtension + 'static>(mut self, ext: E) -> Self {
self.extensions.push(Box::new(ext));
self
}
#[must_use]
pub fn with_context<K: Into<String>, V: Into<Value>>(mut self, key: K, value: V) -> Self {
self.extra_context.insert(key.into(), value.into());
self
}
}
pub struct ConfigBuilder {
scale: f64,
datastore_path: Option<PathBuf>,
base_path: Option<PathBuf>,
aisle_path: Option<PathBuf>,
pantry_path: Option<PathBuf>,
}
impl Default for ConfigBuilder {
fn default() -> Self {
Self {
scale: 1.0,
datastore_path: None,
base_path: std::env::current_dir().ok(),
aisle_path: None,
pantry_path: None,
}
}
}
impl ConfigBuilder {
pub fn scale(&mut self, scale: f64) -> &mut Self {
self.scale = scale;
self
}
pub fn datastore_path<P: Into<PathBuf>>(&mut self, datstore_path: P) -> &mut Self {
self.datastore_path = Some(datstore_path.into());
self
}
pub fn base_path<P: Into<PathBuf>>(&mut self, base_path: P) -> &mut Self {
self.base_path = Some(base_path.into());
self
}
pub fn aisle_path<P: Into<PathBuf>>(&mut self, aisle_path: P) -> &mut Self {
self.aisle_path = Some(aisle_path.into());
self
}
pub fn pantry_path<P: Into<PathBuf>>(&mut self, pantry_path: P) -> &mut Self {
self.pantry_path = Some(pantry_path.into());
self
}
pub fn build(&mut self) -> Config {
Config {
scale: self.scale,
datastore_path: self.datastore_path.clone(),
base_path: self.base_path.clone(),
aisle_path: self.aisle_path.clone(),
pantry_path: self.pantry_path.clone(),
extensions: Vec::new(),
extra_context: BTreeMap::new(),
}
}
}