rship_entities/
keyframe.rs1use crate::common::ConcreteSchemaType;
2use ordered_float::OrderedFloat;
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6#[cfg(feature = "mods")]
7use {
8 myko_macros::Eventable, 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}