rship_entities/
keyframe.rs

1use crate::common::ConcreteSchemaType;
2use ordered_float::OrderedFloat;
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6#[cfg(feature = "mods")]
7use {
8    myko_macros::Eventable, //
9    partially::Partial,
10};
11
12#[derive(Clone, Serialize, Deserialize, Debug)]
13#[serde(rename_all = "camelCase")]
14#[cfg_attr(feature = "mods", derive(Partial, PartialEq, Eventable))]
15#[cfg_attr(
16    feature = "mods",
17    partially(derive(Clone, Serialize, Deserialize, Default))
18)]
19pub struct Keyframe {
20    pub id: String,
21    pub hash: String,
22    pub event_track_id: String,
23    pub layer_id: String,
24    pub time: u64,
25    pub data: KeyframeData,
26}
27
28#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)]
29#[serde(rename_all = "camelCase")]
30pub struct NumberKeyframeData {
31    pub value: OrderedFloat<f64>,
32    pub fade_in: Option<OrderedFloat<f64>>,
33    pub curve_id: Option<String>,
34}
35
36#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)]
37#[serde(rename_all = "camelCase")]
38pub struct IntegerKeyframeData {
39    pub value: i64,
40    pub fade_in: Option<OrderedFloat<f64>>,
41    pub curve_id: Option<String>,
42}
43
44#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)]
45#[serde(rename_all = "camelCase")]
46pub struct StringKeyframeData {
47    pub value: String,
48}
49
50#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)]
51#[serde(rename_all = "camelCase")]
52pub struct BooleanKeyframeData {
53    pub value: bool,
54}
55
56#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)]
57#[serde(rename_all = "camelCase")]
58pub struct NullKeyframeData {
59    pub value: Uuid,
60}
61
62#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)]
63#[serde(rename_all = "camelCase")]
64#[serde(tag = "type")]
65pub enum KeyframeData {
66    Number(NumberKeyframeData),
67    Integer(IntegerKeyframeData),
68    String(StringKeyframeData),
69    Boolean(BooleanKeyframeData),
70    Null(NullKeyframeData),
71}
72
73pub trait TKeyframeData: Clone {}
74
75impl TKeyframeData for NumberKeyframeData {}
76impl TKeyframeData for IntegerKeyframeData {}
77impl TKeyframeData for StringKeyframeData {}
78impl TKeyframeData for BooleanKeyframeData {}
79impl TKeyframeData for NullKeyframeData {}
80
81impl From<NumberKeyframeData> for ConcreteSchemaType {
82    fn from(_: NumberKeyframeData) -> Self {
83        ConcreteSchemaType::Number
84    }
85}
86
87impl From<IntegerKeyframeData> for ConcreteSchemaType {
88    fn from(_: IntegerKeyframeData) -> Self {
89        ConcreteSchemaType::Integer
90    }
91}
92
93impl From<StringKeyframeData> for ConcreteSchemaType {
94    fn from(_: StringKeyframeData) -> Self {
95        ConcreteSchemaType::String
96    }
97}
98
99impl From<BooleanKeyframeData> for ConcreteSchemaType {
100    fn from(_: BooleanKeyframeData) -> Self {
101        ConcreteSchemaType::Boolean
102    }
103}
104
105impl From<NullKeyframeData> for ConcreteSchemaType {
106    fn from(_: NullKeyframeData) -> Self {
107        ConcreteSchemaType::Null
108    }
109}
110
111impl From<NullKeyframeData> for KeyframeData {
112    fn from(data: NullKeyframeData) -> Self {
113        KeyframeData::Null(data)
114    }
115}
116
117impl From<BooleanKeyframeData> for KeyframeData {
118    fn from(data: BooleanKeyframeData) -> Self {
119        KeyframeData::Boolean(data)
120    }
121}
122
123impl From<StringKeyframeData> for KeyframeData {
124    fn from(data: StringKeyframeData) -> Self {
125        KeyframeData::String(data)
126    }
127}
128
129impl From<IntegerKeyframeData> for KeyframeData {
130    fn from(data: IntegerKeyframeData) -> Self {
131        KeyframeData::Integer(data)
132    }
133}
134
135impl From<NumberKeyframeData> for KeyframeData {
136    fn from(data: NumberKeyframeData) -> Self {
137        KeyframeData::Number(data)
138    }
139}
140
141impl From<KeyframeData> for ConcreteSchemaType {
142    fn from(data: KeyframeData) -> Self {
143        match data {
144            KeyframeData::Number(_) => ConcreteSchemaType::Number,
145            KeyframeData::Integer(_) => ConcreteSchemaType::Integer,
146            KeyframeData::String(_) => ConcreteSchemaType::String,
147            KeyframeData::Boolean(_) => ConcreteSchemaType::Boolean,
148            KeyframeData::Null(_) => ConcreteSchemaType::Null,
149        }
150    }
151}