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,26 +174,42 @@ 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
where D: Deserializer<'a>,
D: Deserializer<'a>, {
{ let value = Value::deserialize(deserializer)?;
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,
);
if let Value::String(instance) = value { Ok(DEFAULT_NAME.into())
return Ok(Class { instance, general: DEFAULT_NAME.into() }); },
} }
}
match Self::deserialize(value) {
Ok(value) => Ok(value), fn deserialize_class<'a, D>(deserializer: D) -> Result<Class, D::Error>
Err(err) => { where
error!( D: Deserializer<'a>,
target: LOG_TARGET_CONFIG, {
"Problem with config: {}; using class Alacritty", err let value = Value::deserialize(deserializer)?;
);
Ok(Self::default()) if let Value::String(instance) = value {
}, return Ok(Class { instance, general: DEFAULT_NAME.into() });
} }
match Class::deserialize(value) {
Ok(value) => Ok(value),
Err(err) => {
error!(
target: LOG_TARGET_CONFIG,
"Problem with config: {}; using class {}", err, DEFAULT_NAME
);
Ok(Class::default())
},
} }
} }