aboutsummaryrefslogtreecommitdiff
path: root/alacritty_config_derive
diff options
context:
space:
mode:
authorChristian Duerr <contact@christianduerr.com>2023-06-15 10:59:12 +0200
committerGitHub <noreply@github.com>2023-06-15 08:59:12 +0000
commitafffdbe612cb8b573016184400e0deeb0137ccb9 (patch)
tree3f79b638ec3e5c8f85f2ba784898ee1fa9034322 /alacritty_config_derive
parentbe03effdbe5b5bdabfed50d87963e78017329182 (diff)
downloadalacritty-afffdbe612cb8b573016184400e0deeb0137ccb9.tar.gz
alacritty-afffdbe612cb8b573016184400e0deeb0137ccb9.zip
Fix `alacritty msg config` toml replacement
This fixes a regression introduced in bd49067 which broke the override of configuration file variables using `alacritty msg config`. To fix this the `replace` functionality was rewritten to behave more like the `serde_utils::merge` where entire values are inserted into the existing structure rather than separating the keys from the values. Fixes: bd49067 (Switch to TOML configuration format)
Diffstat (limited to 'alacritty_config_derive')
-rw-r--r--alacritty_config_derive/src/serde_replace.rs38
-rw-r--r--alacritty_config_derive/tests/config.rs12
2 files changed, 25 insertions, 25 deletions
diff --git a/alacritty_config_derive/src/serde_replace.rs b/alacritty_config_derive/src/serde_replace.rs
index 7ca5ca7c..0a703b4c 100644
--- a/alacritty_config_derive/src/serde_replace.rs
+++ b/alacritty_config_derive/src/serde_replace.rs
@@ -28,11 +28,7 @@ pub fn derive(input: TokenStream) -> TokenStream {
pub fn derive_direct(ident: Ident, generics: Generics) -> TokenStream2 {
quote! {
impl <#generics> alacritty_config::SerdeReplace for #ident <#generics> {
- fn replace(&mut self, key: &str, value: toml::Value) -> Result<(), Box<dyn std::error::Error>> {
- if !key.is_empty() {
- let error = format!("Fields \"{}\" do not exist", key);
- return Err(error.into());
- }
+ fn replace(&mut self, value: toml::Value) -> Result<(), Box<dyn std::error::Error>> {
*self = serde::Deserialize::deserialize(value)?;
Ok(())
@@ -53,19 +49,23 @@ pub fn derive_recursive<T>(
quote! {
#[allow(clippy::extra_unused_lifetimes)]
impl <'de, #constrained> alacritty_config::SerdeReplace for #ident <#unconstrained> {
- fn replace(&mut self, key: &str, value: toml::Value) -> Result<(), Box<dyn std::error::Error>> {
- if key.is_empty() {
- *self = serde::Deserialize::deserialize(value)?;
- return Ok(());
- }
-
- let (field, next_key) = key.split_once('.').unwrap_or((key, ""));
- match field {
- #replace_arms
- _ => {
- let error = format!("Field \"{}\" does not exist", field);
- return Err(error.into());
+ fn replace(&mut self, value: toml::Value) -> Result<(), Box<dyn std::error::Error>> {
+ match value.as_table() {
+ Some(table) => {
+ for (field, next_value) in table {
+ let next_value = next_value.clone();
+ let value = value.clone();
+
+ match field.as_str() {
+ #replace_arms
+ _ => {
+ let error = format!("Field \"{}\" does not exist", field);
+ return Err(error.into());
+ },
+ }
+ }
},
+ None => *self = serde::Deserialize::deserialize(value)?,
}
Ok(())
@@ -95,11 +95,11 @@ fn match_arms<T>(fields: &Punctuated<Field, T>) -> TokenStream2 {
return Error::new(ident.span(), MULTIPLE_FLATTEN_ERROR).to_compile_error();
} else if flatten {
flattened_arm = Some(quote! {
- _ => alacritty_config::SerdeReplace::replace(&mut self.#ident, key, value)?,
+ _ => alacritty_config::SerdeReplace::replace(&mut self.#ident, value)?,
});
} else {
stream.extend(quote! {
- #literal => alacritty_config::SerdeReplace::replace(&mut self.#ident, next_key, value)?,
+ #literal => alacritty_config::SerdeReplace::replace(&mut self.#ident, next_value)?,
});
}
}
diff --git a/alacritty_config_derive/tests/config.rs b/alacritty_config_derive/tests/config.rs
index 15bc62a9..3130bcda 100644
--- a/alacritty_config_derive/tests/config.rs
+++ b/alacritty_config_derive/tests/config.rs
@@ -173,8 +173,8 @@ impl Log for Logger {
fn field_replacement() {
let mut test = Test::default();
- let value = toml::Value::Integer(13);
- test.replace("nesting.field2", value).unwrap();
+ let value = toml::from_str("nesting.field2=13").unwrap();
+ test.replace(value).unwrap();
assert_eq!(test.nesting.field2, Some(13));
}
@@ -183,8 +183,8 @@ fn field_replacement() {
fn replace_derive() {
let mut test = Test::default();
- let value = toml::Value::Integer(9);
- test.replace("nesting.newtype", value).unwrap();
+ let value = toml::from_str("nesting.newtype=9").unwrap();
+ test.replace(value).unwrap();
assert_eq!(test.nesting.newtype, NewType(9));
}
@@ -193,8 +193,8 @@ fn replace_derive() {
fn replace_flatten() {
let mut test = Test::default();
- let value = toml::Value::Integer(7);
- test.replace("flatty", value).unwrap();
+ let value = toml::from_str("flatty=7").unwrap();
+ test.replace(value).unwrap();
assert_eq!(test.flatten.flatty, 7);
}