about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNick Cameron <nrc@ncameron.org>2015-09-05 10:11:50 +1200
committerNick Cameron <nrc@ncameron.org>2015-09-05 10:11:50 +1200
commitc838b00d540d6e85b7a4ead656ff37d8b9e641cc (patch)
treedf4de7f89dd728e6f098e30ecd1aaf99c77bac38
parentf5ee0f0986f23acb27fabf257e11eb76c6981601 (diff)
parent14a94f0bcd4d6892674cbe7dcaf8f3613cac30fc (diff)
Merge pull request #257 from cburgdorf/partial_config
Allow partial rustfmt.toml
-rw-r--r--src/config.rs25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/config.rs b/src/config.rs
index 1b4d79ab6ee..c7525e930ec 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -52,10 +52,30 @@ macro_rules! create_config {
             $(pub $i: $ty),+
         }
 
+        // Just like the Config struct but with each property wrapped
+        // as Option<T>. This is used to parse a rustfmt.toml that doesn't
+        // specity all properties of `Config`.
+        // We first parse into `ParsedConfig`, then create a default `Config`
+        // and overwrite the properties with corresponding values from `ParsedConfig`
+        #[derive(RustcDecodable, Clone)]
+        pub struct ParsedConfig {
+            $(pub $i: Option<$ty>),+
+        }
+
         impl Config {
+
+            fn fill_from_parsed_config(mut self, parsed: &ParsedConfig) -> Config {
+            $(
+                if let Some(val) = parsed.$i {
+                    self.$i = val;
+                }
+            )+
+                self
+            }
+
             pub fn from_toml(toml: &str) -> Config {
                 let parsed = toml.parse().unwrap();
-                match toml::decode(parsed) {
+                let parsed_config:ParsedConfig = match toml::decode(parsed) {
                     Some(decoded) => decoded,
                     None => {
                         println!("Decoding config file failed. Config:\n{}", toml);
@@ -63,7 +83,8 @@ macro_rules! create_config {
                         println!("\n\nParsed:\n{:?}", parsed);
                         panic!();
                     }
-                }
+                };
+                Config::default().fill_from_parsed_config(&parsed_config)
             }
 
             pub fn override_value(&mut self, key: &str, val: &str) {