diff --git a/src/config.rs b/src/config.rs index f19e59a2..ed5ef746 100644 --- a/src/config.rs +++ b/src/config.rs @@ -11,6 +11,7 @@ use source::Source; use path; use value::{Value, ValueKind, ValueWithKey}; +use file::{File, FileFormat}; #[derive(Clone, Debug)] enum ConfigKind { @@ -49,7 +50,10 @@ pub struct Config { impl Config { pub fn new() -> Self { - Config::default() + let mut c = Config::default(); + c.merge(File::from_str("", FileFormat::Toml)); + + c } /// Merge in a configuration property source. @@ -129,6 +133,25 @@ impl Config { self.refresh() } + pub fn set_defaults(&mut self, value: T) -> Result<&mut Config> + { + match self.kind{ + ConfigKind::Mutable { + ref mut defaults, .. + } => { + let mut serializer = ConfigSerializer::default(); + value.serialize(&mut serializer)?; + for (key, val) in serializer.output.collect()?{ + defaults.insert(key.parse()?, val); + } + } + + ConfigKind::Frozen => return Err(ConfigError::Frozen), + } + + self.refresh() + } + pub fn set(&mut self, key: &str, value: T) -> Result<&mut Config> where T: Into, diff --git a/tests/config_defaults.rs b/tests/config_defaults.rs new file mode 100644 index 00000000..881cd54a --- /dev/null +++ b/tests/config_defaults.rs @@ -0,0 +1,33 @@ +extern crate config; + +#[macro_use] +extern crate serde_derive; + +use config::*; + +#[derive(Debug, Serialize, Deserialize)] +pub struct Settings { + pub db_host: String, +} + +impl Default for Settings { + fn default() -> Self { + Settings { + db_host: String::from("default"), + } + } +} + +impl Settings { + pub fn new() -> Result { + let mut s = Config::new(); + s.set_defaults(Settings::default()); + s.try_into() + } +} + +#[test] +fn config_with_defaults(){ + let mut s = Settings::new().unwrap(); + assert_eq!(s.db_host, "default"); +}