= try!(BTreeMapVisitor::new().visit_map(visitor));
+ let pruning: Value = try!(map.remove("pruning".into()).ok_or_else(|| Error::custom("missing pruning")));
+ let pruning = try!(pruning.as_str().ok_or_else(|| Error::custom("invalid pruning value")));
+ let pruning = try!(pruning.parse().map_err(|_| Error::custom("invalid pruning method")));
+ let tracing: Value = try!(map.remove("tracing".into()).ok_or_else(|| Error::custom("missing tracing")));
+ let tracing = try!(tracing.as_bool().ok_or_else(|| Error::custom("invalid tracing value")));
+
+ let user_defaults = UserDefaults {
+ is_first_launch: false,
+ pruning: pruning,
+ tracing: tracing,
+ };
+
+ Ok(user_defaults)
+ }
+}
+
+impl Default for UserDefaults {
+ fn default() -> Self {
+ UserDefaults {
+ is_first_launch: true,
+ pruning: Algorithm::default(),
+ tracing: false,
+ }
+ }
+}
+
+impl UserDefaults {
+ pub fn load(path: P) -> Result where P: AsRef {
+ match File::open(path) {
+ Ok(file) => from_reader(file).map_err(|e| e.to_string()),
+ _ => Ok(UserDefaults::default()),
+ }
+ }
+
+ pub fn save(self, path: P) -> Result<(), String> where P: AsRef {
+ let mut file: File = try!(File::create(path).map_err(|_| "Cannot create user defaults file".to_owned()));
+ file.write_all(to_string(&self).unwrap().as_bytes()).map_err(|_| "Failed to save user defaults".to_owned())
+ }
+}