Fix class and cursor thickness deserialization

Fixes #3820.
This commit is contained in:
Kirill Chibisov 2020-06-06 01:31:57 +03:00 committed by GitHub
parent f99220f015
commit de3437bcd6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 57 additions and 25 deletions

View File

@ -277,12 +277,24 @@ impl Default for Cursor {
} }
} }
pub fn deserialize_cursor_thickness<'a, D>(deserializer: D) -> Result<Percentage, D::Error> fn deserialize_cursor_thickness<'a, D>(deserializer: D) -> Result<Percentage, D::Error>
where where
D: Deserializer<'a>, D: Deserializer<'a>,
{ {
Ok(Percentage::deserialize(Value::deserialize(deserializer)?) let value = Value::deserialize(deserializer)?;
.unwrap_or_else(|_| Percentage::new(DEFAULT_CURSOR_THICKNESS))) match Percentage::deserialize(value) {
Ok(value) => Ok(value),
Err(err) => {
error!(
target: LOG_TARGET_CONFIG,
"Problem with config: {}, using default thickness value {}",
err,
DEFAULT_CURSOR_THICKNESS
);
Ok(Percentage::new(DEFAULT_CURSOR_THICKNESS))
},
}
} }
#[serde(untagged)] #[serde(untagged)]

View File

@ -42,7 +42,7 @@ pub struct WindowConfig {
pub title: String, pub title: String,
/// Window class. /// Window class.
#[serde(deserialize_with = "failure_default")] #[serde(deserialize_with = "deserialize_class")]
pub class: Class, pub class: Class,
/// XEmbed parent. /// XEmbed parent.
@ -158,9 +158,13 @@ impl Dimensions {
} }
/// Window class hint. /// Window class hint.
#[derive(Debug, Clone, PartialEq, Eq)] #[serde(default)]
#[derive(Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct Class { pub struct Class {
#[serde(deserialize_with = "deserialize_class_resource")]
pub instance: String, pub instance: String,
#[serde(deserialize_with = "deserialize_class_resource")]
pub general: String, pub general: String,
} }
@ -170,8 +174,25 @@ impl Default for Class {
} }
} }
impl<'a> Deserialize<'a> for Class { fn deserialize_class_resource<'a, D>(deserializer: D) -> Result<String, D::Error>
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: Deserializer<'a>,
{
let value = Value::deserialize(deserializer)?;
match String::deserialize(value) {
Ok(value) => Ok(value),
Err(err) => {
error!(
target: LOG_TARGET_CONFIG,
"Problem with config: {}, using default value {}", err, DEFAULT_NAME,
);
Ok(DEFAULT_NAME.into())
},
}
}
fn deserialize_class<'a, D>(deserializer: D) -> Result<Class, D::Error>
where where
D: Deserializer<'a>, D: Deserializer<'a>,
{ {
@ -181,15 +202,14 @@ impl<'a> Deserialize<'a> for Class {
return Ok(Class { instance, general: DEFAULT_NAME.into() }); return Ok(Class { instance, general: DEFAULT_NAME.into() });
} }
match Self::deserialize(value) { match Class::deserialize(value) {
Ok(value) => Ok(value), Ok(value) => Ok(value),
Err(err) => { Err(err) => {
error!( error!(
target: LOG_TARGET_CONFIG, target: LOG_TARGET_CONFIG,
"Problem with config: {}; using class Alacritty", err "Problem with config: {}; using class {}", err, DEFAULT_NAME
); );
Ok(Self::default()) Ok(Class::default())
}, },
} }
} }
}