use crate::schema::{
animation::{composition::Composition, meta::Meta},
assets::AnyAsset,
helpers::{int_boolean::BoolInt, marker::Marker, visual_object::VisualObject},
layers::AnyLayer,
};
use serde::{Deserialize, Serialize};
use std::fmt::Display;
#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
pub struct Animation {
#[serde(flatten)]
pub visual_object: VisualObject,
#[serde(flatten)]
pub composition: Composition,
#[serde(rename = "v")]
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(rename = "ver")]
#[serde(skip_serializing_if = "Option::is_none")]
pub ver: Option<u32>,
#[serde(rename = "fr")]
pub frame_rate: f64,
#[serde(rename = "ip")]
pub in_point: f64,
#[serde(rename = "op")]
pub out_point: f64,
#[serde(rename = "w")]
pub width: usize,
#[serde(rename = "h")]
pub height: usize,
#[serde(rename = "ddd", default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub three_dimensional: Option<BoolInt>,
#[serde(skip_serializing_if = "Option::is_none")]
pub assets: Option<Vec<AnyAsset>>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub markers: Option<Vec<Marker>>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub meta: Option<Meta>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
}
impl Animation {
pub fn from_slice(v: &[u8]) -> Result<Animation, serde_json::Error> {
serde_json::from_slice(v)
}
pub fn from_json(v: serde_json::Value) -> Result<Animation, serde_json::Error> {
serde_json::from_value(v)
}
}
impl std::str::FromStr for Animation {
type Err = serde_json::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
serde_json::from_str(s)
}
}
impl Display for Animation {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", serde_json::to_string(&self).unwrap())
}
}