From 985788b855362d8783ca3615bb4e2af1ba49ef11 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 1 Sep 2021 16:14:25 -0700 Subject: [PATCH] Allow uniform margins and paddings to be specified as single numbers Co-Authored-By: Nathan Sobo --- gpui/src/elements/container.rs | 83 ++++++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 10 deletions(-) diff --git a/gpui/src/elements/container.rs b/gpui/src/elements/container.rs index fc7fc941cf7edd63cd8ef4a7bd446b48195b23ca..2bab55e832162df52a4232c53daf3e0fb22948ad 100644 --- a/gpui/src/elements/container.rs +++ b/gpui/src/elements/container.rs @@ -241,15 +241,11 @@ impl ToJson for ContainerStyle { } } -#[derive(Clone, Debug, Default, Deserialize)] +#[derive(Clone, Debug, Default)] pub struct Margin { - #[serde(default)] top: f32, - #[serde(default)] left: f32, - #[serde(default)] bottom: f32, - #[serde(default)] right: f32, } @@ -272,18 +268,85 @@ impl ToJson for Margin { } } -#[derive(Clone, Debug, Default, Deserialize)] +#[derive(Clone, Debug, Default)] pub struct Padding { - #[serde(default)] top: f32, - #[serde(default)] left: f32, - #[serde(default)] bottom: f32, - #[serde(default)] right: f32, } +impl<'de> Deserialize<'de> for Padding { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let spacing = Spacing::deserialize(deserializer)?; + Ok(match spacing { + Spacing::Uniform(size) => Padding { + top: size, + left: size, + bottom: size, + right: size, + }, + Spacing::Specific { + top, + left, + bottom, + right, + } => Padding { + top, + left, + bottom, + right, + }, + }) + } +} + +impl<'de> Deserialize<'de> for Margin { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let spacing = Spacing::deserialize(deserializer)?; + Ok(match spacing { + Spacing::Uniform(size) => Margin { + top: size, + left: size, + bottom: size, + right: size, + }, + Spacing::Specific { + top, + left, + bottom, + right, + } => Margin { + top, + left, + bottom, + right, + }, + }) + } +} +#[derive(Deserialize)] +#[serde(untagged)] +enum Spacing { + Uniform(f32), + Specific { + #[serde(default)] + top: f32, + #[serde(default)] + left: f32, + #[serde(default)] + bottom: f32, + #[serde(default)] + right: f32, + }, +} + impl ToJson for Padding { fn to_json(&self) -> serde_json::Value { let mut value = json!({});