use crate::{client::SdkClient, instance::InstanceProxy};
use rship_entities::{
event_track::{EventTrack, EventTrackSourceMode, EventTrackTimeMode, SourcedSourceModeData},
event_track_layer::EventTrackLayer,
keyframe::{Keyframe, TKeyframeData},
};
#[derive(Clone)]
pub struct EventTrackArgs {
pub name: String,
pub short_id: String,
pub time_mode: EventTrackTimeMode,
}
#[derive(Clone)]
pub struct EventTrackLayerArgs {
pub name: String,
pub short_id: String,
pub schema_type: rship_entities::common::ConcreteSchemaType,
}
#[derive(Clone)]
pub struct EventTrackProxy {
pub(crate) instance: InstanceProxy,
pub(crate) args: EventTrackArgs,
pub(crate) client: SdkClient,
}
impl EventTrackProxy {
pub async fn save(&self) {
let event_track = EventTrack {
id: self.id(),
hash: uuid::Uuid::new_v4().to_string(),
name: self.args.name.clone(),
locked: true,
time_mode: self.args.time_mode.clone(),
source_mode: EventTrackSourceMode::Sourced(SourcedSourceModeData {
service_id: self.instance.args.service_id.clone(),
}),
};
if let Err(e) = self.client.save_item(&event_track).await {
println!("Could not save event track: {}", e);
}
}
pub fn id(&self) -> String {
format!("{}:{}", self.instance.args.service_id, self.args.short_id)
}
pub async fn add_layer<T: TKeyframeData>(
&self,
args: EventTrackLayerArgs,
) -> EventTrackLayerProxy<T>
where
rship_entities::keyframe::KeyframeData: std::convert::From<T>,
{
let p = EventTrackLayerProxy::<T> {
event_track: self.clone(),
args,
client: self.client.clone(),
keys: vec![],
phantom: std::marker::PhantomData,
};
p.save().await;
p
}
}
#[derive(Clone)]
pub struct EventTrackLayerProxy<T: TKeyframeData + Clone> {
pub(crate) event_track: EventTrackProxy,
pub(crate) args: EventTrackLayerArgs,
pub(crate) client: SdkClient,
keys: Vec<KeyframeArgs<T>>,
phantom: std::marker::PhantomData<T>,
}
impl<T: TKeyframeData + Clone> EventTrackLayerProxy<T>
where
rship_entities::keyframe::KeyframeData: std::convert::From<T>,
{
pub async fn set_keyframes(&mut self, keyframes: Vec<KeyframeArgs<T>>) {
for keyframe in &self.keys {
let key = keyframe_from_args(keyframe, self);
let _ = self.client.delete_item(&key).await;
}
self.keys.clear();
for keyframe_args in keyframes {
let keyframe = keyframe_from_args(&keyframe_args, self);
if let Err(e) = self.client.save_item(&keyframe).await {
println!("Could not save keyframe: {}", e);
}
self.keys.push(keyframe_args);
}
}
pub fn id(&self) -> String {
format!("{}:{}", self.event_track.id(), self.args.short_id)
}
pub(crate) async fn save(&self) {
let layer = EventTrackLayer {
id: self.id(),
hash: uuid::Uuid::new_v4().to_string(),
name: self.args.name.clone(),
schema_type: self.args.schema_type.clone(),
event_track_id: self.event_track.id(),
};
if let Err(e) = self.client.save_item(&layer).await {
println!("Could not save event track layer: {}", e);
}
}
}
#[derive(Clone)]
pub struct KeyframeArgs<T: TKeyframeData> {
pub time: u64,
pub data: T,
}
fn keyframe_from_args<T: TKeyframeData>(
args: &KeyframeArgs<T>,
layer: &EventTrackLayerProxy<T>,
) -> Keyframe
where
rship_entities::keyframe::KeyframeData: std::convert::From<T>,
{
Keyframe {
id: format!("{}:{}", layer.id(), args.time),
hash: uuid::Uuid::new_v4().to_string(),
time: args.time,
data: args.data.clone().into(),
event_track_id: layer.event_track.id(),
layer_id: layer.id(),
}
}