aboutsummaryrefslogtreecommitdiff
path: root/alacritty_config/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'alacritty_config/src/lib.rs')
-rw-r--r--alacritty_config/src/lib.rs37
1 files changed, 35 insertions, 2 deletions
diff --git a/alacritty_config/src/lib.rs b/alacritty_config/src/lib.rs
index c5a43b87..81e43bb8 100644
--- a/alacritty_config/src/lib.rs
+++ b/alacritty_config/src/lib.rs
@@ -1,5 +1,6 @@
use std::collections::HashMap;
use std::error::Error;
+use std::path::PathBuf;
use log::LevelFilter;
use serde::Deserialize;
@@ -9,6 +10,7 @@ pub trait SerdeReplace {
fn replace(&mut self, value: Value) -> Result<(), Box<dyn Error>>;
}
+#[macro_export]
macro_rules! impl_replace {
($($ty:ty),*$(,)*) => {
$(
@@ -29,6 +31,7 @@ impl_replace!(
bool,
char,
String,
+ PathBuf,
LevelFilter,
);
@@ -47,9 +50,12 @@ impl<'de, T: Deserialize<'de>> SerdeReplace for Vec<T> {
}
}
-impl<'de, T: Deserialize<'de>> SerdeReplace for Option<T> {
+impl<'de, T: SerdeReplace + Deserialize<'de>> SerdeReplace for Option<T> {
fn replace(&mut self, value: Value) -> Result<(), Box<dyn Error>> {
- replace_simple(self, value)
+ match self {
+ Some(inner) => inner.replace(value),
+ None => replace_simple(self, value),
+ }
}
}
@@ -58,3 +64,30 @@ impl<'de, T: Deserialize<'de>> SerdeReplace for HashMap<String, T> {
replace_simple(self, value)
}
}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ use crate as alacritty_config;
+ use alacritty_config_derive::ConfigDeserialize;
+
+ #[test]
+ fn replace_option() {
+ #[derive(ConfigDeserialize, Default, PartialEq, Eq, Debug)]
+ struct ReplaceOption {
+ a: usize,
+ b: usize,
+ }
+
+ let mut subject: Option<ReplaceOption> = None;
+
+ let value: Value = toml::from_str("a=1").unwrap();
+ SerdeReplace::replace(&mut subject, value).unwrap();
+
+ let value: Value = toml::from_str("b=2").unwrap();
+ SerdeReplace::replace(&mut subject, value).unwrap();
+
+ assert_eq!(subject, Some(ReplaceOption { a: 1, b: 2 }));
+ }
+}