use crate::schema::helpers::bezier::Bezier;
use crate::schema::helpers::int_boolean::BoolInt;
use serde::de::{self, Deserializer};
use serde::{Deserialize, Serialize};
use super::shape_keyframe::ShapeKeyframe;
#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
pub struct ShapeProperty {
#[serde(rename = "ix")]
#[serde(skip_serializing_if = "Option::is_none")]
pub property_index: Option<f64>,
#[serde(rename = "a")]
#[serde(skip_serializing_if = "Option::is_none")]
pub animated: Option<BoolInt>,
#[serde(rename = "x")]
#[serde(skip_serializing_if = "Option::is_none")]
pub expression: Option<String>,
#[serde(rename = "k")]
pub value: ShapePropertyK,
}
#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
#[serde(untagged)]
pub enum ShapePropertyK {
#[serde(deserialize_with = "deserialize_keyframes")]
Animated(Vec<ShapeKeyframe>),
Static(Bezier),
}
pub fn deserialize_keyframes<'de, D>(deserializer: D) -> Result<Vec<ShapeKeyframe>, D::Error>
where
D: Deserializer<'de>,
{
let keyframes = Vec::<ShapeKeyframe>::deserialize(deserializer)?;
if keyframes.is_empty() {
return Ok(keyframes);
}
if !keyframes[0..(keyframes.len() - 1)]
.iter()
.all(|keyframe| keyframe.start.is_some())
{
return Err(de::Error::custom(
"Animated Shape Keyframe found with missing 's' start property. Only the last keyframe may omit this.",
));
}
if let Some(last_keyframe) = keyframes.last()
&& last_keyframe.start.is_some()
{
return Ok(keyframes);
}
if keyframes.len() < 2 {
Err(de::Error::custom(
"Last Animated Shape Keyframe 's' was omitted where only one keyframe is present.",
))
} else {
Ok(keyframes)
}
}