use crate::host::scene_message::*;
use crate::host::stream_target::*;
use crate::host::programs::*;
use serde::*;
use std::marker::{PhantomData};
use std::sync::*;
#[derive(Clone, PartialEq, Eq, Debug)]
#[derive(Serialize, Deserialize)]
pub struct RunCommand<TParameter, TResponse> {
target: StreamTarget,
name: String,
parameter: TParameter,
response: PhantomData<Mutex<TResponse>>,
}
impl<TParameter, TResponse> RunCommand<TParameter, TResponse>
where
TParameter: Unpin + Send,
TResponse: Unpin + Send
{
pub fn new(target: impl Into<StreamTarget>, name: impl Into<String>, parameter: impl Into<TParameter>) -> Self {
Self {
target: target.into(),
name: name.into(),
parameter: parameter.into(),
response: PhantomData,
}
}
pub fn target(&self) -> StreamTarget {
self.target.clone()
}
pub fn name(&self) -> &str {
&self.name
}
pub fn parameter(&self) -> &TParameter {
&self.parameter
}
}
impl<TParameter, TResponse> SceneMessage for RunCommand<TParameter, TResponse>
where
TParameter: 'static + Unpin + Send + Serialize,
TResponse: 'static + Unpin + Send + Serialize,
for<'de> TParameter: Deserialize<'de>,
for<'de> TResponse: Deserialize<'de>
{
#[inline]
fn message_type_name() -> String { format!("flo_scene::RunCommand<{}, {}>", std::any::type_name::<TParameter>(), std::any::type_name::<TResponse>()) }
}
impl<TParameter, TResponse> QueryRequest for RunCommand<TParameter, TResponse>
where
TParameter: 'static + Unpin + Send + Serialize,
TResponse: 'static + Unpin + Send + Serialize,
for<'de> TParameter: Deserialize<'de>,
for<'de> TResponse: Deserialize<'de>
{
type ResponseData = TResponse;
fn with_new_target(self, new_target: StreamTarget) -> Self {
RunCommand {
target: new_target,
name: self.name,
parameter: self.parameter,
response: PhantomData
}
}
}