From a8292818417d8b06ab4a274e38b5801564390331 Mon Sep 17 00:00:00 2001 From: Sergei Kartsev Date: Mon, 19 May 2025 02:55:35 +0200 Subject: [PATCH] Fix prevent zero value for buffer line height (#30832) Closes #30802 Release Notes: - Fixed issue where setting `buffer_line_height.custom` to 0 would cause text to disappear --------- Co-authored-by: Michael Sloan --- crates/theme/src/settings.rs | 71 ++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 4 deletions(-) diff --git a/crates/theme/src/settings.rs b/crates/theme/src/settings.rs index 12f23ee6bdfc1adeba14e0eacbfa27982e0dea1b..eedee05592e2c5256a1b3afef46f83183f20b344 100644 --- a/crates/theme/src/settings.rs +++ b/crates/theme/src/settings.rs @@ -553,10 +553,22 @@ pub enum BufferLineHeight { Comfortable, /// The default line height. Standard, - /// A custom line height. - /// - /// A line height of 1.0 is the height of the buffer's font size. - Custom(f32), + /// A custom line height, where 1.0 is the font's height. Must be at least 1.0. + Custom(#[serde(deserialize_with = "deserialize_line_height")] f32), +} + +fn deserialize_line_height<'de, D>(deserializer: D) -> Result +where + D: serde::Deserializer<'de>, +{ + let value = f32::deserialize(deserializer)?; + if value < 1.0 { + return Err(serde::de::Error::custom( + "buffer_line_height.custom must be at least 1.0", + )); + } + + Ok(value) } impl BufferLineHeight { @@ -1010,3 +1022,54 @@ fn merge(target: &mut T, value: Option) { *target = value; } } + +#[cfg(test)] +mod tests { + use super::*; + use serde_json::json; + + #[test] + fn test_buffer_line_height_deserialize_valid() { + assert_eq!( + serde_json::from_value::(json!("comfortable")).unwrap(), + BufferLineHeight::Comfortable + ); + assert_eq!( + serde_json::from_value::(json!("standard")).unwrap(), + BufferLineHeight::Standard + ); + assert_eq!( + serde_json::from_value::(json!({"custom": 1.0})).unwrap(), + BufferLineHeight::Custom(1.0) + ); + assert_eq!( + serde_json::from_value::(json!({"custom": 1.5})).unwrap(), + BufferLineHeight::Custom(1.5) + ); + } + + #[test] + fn test_buffer_line_height_deserialize_invalid() { + assert!( + serde_json::from_value::(json!({"custom": 0.99})) + .err() + .unwrap() + .to_string() + .contains("buffer_line_height.custom must be at least 1.0") + ); + assert!( + serde_json::from_value::(json!({"custom": 0.0})) + .err() + .unwrap() + .to_string() + .contains("buffer_line_height.custom must be at least 1.0") + ); + assert!( + serde_json::from_value::(json!({"custom": -1.0})) + .err() + .unwrap() + .to_string() + .contains("buffer_line_height.custom must be at least 1.0") + ); + } +}