use serde::{Deserialize, Serialize};
use crate::schema::animated_properties::value::FloatValue;
use super::visual::VisualLayer;
#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
pub struct PrecompositionLayer {
#[serde(flatten)]
pub visual_layer: VisualLayer,
#[serde(rename = "refId")]
pub ref_id: String,
#[serde(rename = "w")]
pub width: f64,
#[serde(rename = "h")]
pub height: f64,
#[serde(rename = "st")]
pub start_time: f64,
#[serde(rename = "tm")]
#[serde(skip_serializing_if = "Option::is_none")]
pub time_remap: Option<FloatValue>,
}
#[cfg(test)]
mod tests {
use crate::schema::{
animation::composition::Composition,
assets::{asset::Asset, precomposition::Precomposition},
helpers::{int_boolean::BoolInt, visual_object::VisualObject},
};
use serde_json::json;
use std::sync::LazyLock;
static JSON: LazyLock<serde_json::Value> = LazyLock::new(|| {
json!(
{
"id": "precomp_0",
"fr": 60,
"nm": "Example",
"xt": 0,
"layers": []
}
)
});
static PRECOMP: LazyLock<Precomposition> = LazyLock::new(|| Precomposition {
asset: Asset {
visual_object: VisualObject {
name: Some("Example".to_string()),
..Default::default()
},
id: "precomp_0".to_string(),
},
composition: Composition { layers: vec![] },
frame_rate: Some(60.0),
extra: Some(BoolInt::False),
});
#[test]
fn test_serde_deserialize() {
let actual = serde_json::from_value(JSON.to_owned());
match actual {
Ok(actual) => assert_eq!(*PRECOMP, actual),
Err(e) => panic!("{e}"),
}
}
#[test]
fn test_can_serialize() {
serde_json::to_value(&*PRECOMP).unwrap();
}
}