Add deserialization helper

This commit is contained in:
Mikayla 2023-08-12 12:21:44 -07:00
parent fa7ebd0825
commit 563b25f26f
No known key found for this signature in database
2 changed files with 43 additions and 1 deletions

View file

@ -30,6 +30,7 @@ pub struct ContainerStyle {
#[serde(default)]
pub border: Border,
#[serde(default)]
#[serde(alias = "corner_radius")]
pub corner_radii: CornerRadii,
#[serde(default)]
pub shadow: Option<Shadow>,

View file

@ -70,7 +70,7 @@ pub struct Quad {
pub corner_radii: CornerRadii,
}
#[derive(Default, Debug, Mul, Clone, Copy, Deserialize, Serialize, JsonSchema)]
#[derive(Default, Debug, Mul, Clone, Copy, Serialize, JsonSchema)]
pub struct CornerRadii {
pub top_left: f32,
pub top_right: f32,
@ -78,6 +78,47 @@ pub struct CornerRadii {
pub bottom_left: f32,
}
impl<'de> Deserialize<'de> for CornerRadii {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
#[derive(Deserialize)]
pub struct CornerRadiiHelper {
pub top_left: f32,
pub top_right: f32,
pub bottom_right: f32,
pub bottom_left: f32,
}
#[derive(Deserialize)]
#[serde(untagged)]
enum RadiusOrRadii {
Radius(f32),
Radii(CornerRadiiHelper),
}
let json = RadiusOrRadii::deserialize(deserializer)?;
let result = match json {
RadiusOrRadii::Radius(radius) => CornerRadii::from(radius),
RadiusOrRadii::Radii(CornerRadiiHelper {
top_left,
top_right,
bottom_right,
bottom_left,
}) => CornerRadii {
top_left,
top_right,
bottom_right,
bottom_left,
},
};
Ok(result)
}
}
impl From<f32> for CornerRadii {
fn from(radius: f32) -> Self {
Self {