rship-sdk 0.1.19

rship sdk in rust!
Documentation
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 {
            log::error!("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 {
                log::error!("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 {
            log::error!("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(),
    }
}