flo_scene/host/commands/
run_command.rs1use crate::host::scene_message::*;
2use crate::host::stream_target::*;
3use crate::host::programs::*;
4
5use serde::*;
6
7use std::marker::{PhantomData};
8use std::sync::*;
9
10#[derive(Clone, PartialEq, Eq, Debug)]
14#[derive(Serialize, Deserialize)]
15pub struct RunCommand<TParameter, TResponse> {
16 target: StreamTarget,
18
19 name: String,
21
22 parameter: TParameter,
24
25 response: PhantomData<Mutex<TResponse>>,
27}
28
29impl<TParameter, TResponse> RunCommand<TParameter, TResponse>
30where
31 TParameter: Unpin + Send,
32 TResponse: Unpin + Send
33{
34 pub fn new(target: impl Into<StreamTarget>, name: impl Into<String>, parameter: impl Into<TParameter>) -> Self {
38 Self {
39 target: target.into(),
40 name: name.into(),
41 parameter: parameter.into(),
42 response: PhantomData,
43 }
44 }
45
46 pub fn target(&self) -> StreamTarget {
50 self.target.clone()
51 }
52
53 pub fn name(&self) -> &str {
57 &self.name
58 }
59
60 pub fn parameter(&self) -> &TParameter {
64 &self.parameter
65 }
66}
67
68impl<TParameter, TResponse> SceneMessage for RunCommand<TParameter, TResponse>
69where
70 TParameter: 'static + Unpin + Send + Serialize,
71 TResponse: 'static + Unpin + Send + Serialize,
72 for<'de> TParameter: Deserialize<'de>,
73 for<'de> TResponse: Deserialize<'de>
74{
75 #[inline]
76 fn message_type_name() -> String { format!("flo_scene::RunCommand<{}, {}>", std::any::type_name::<TParameter>(), std::any::type_name::<TResponse>()) }
77}
78
79impl<TParameter, TResponse> QueryRequest for RunCommand<TParameter, TResponse>
80where
81 TParameter: 'static + Unpin + Send + Serialize,
82 TResponse: 'static + Unpin + Send + Serialize,
83 for<'de> TParameter: Deserialize<'de>,
84 for<'de> TResponse: Deserialize<'de>
85{
86 type ResponseData = TResponse;
87
88 fn with_new_target(self, new_target: StreamTarget) -> Self {
89 RunCommand {
90 target: new_target,
91 name: self.name,
92 parameter: self.parameter,
93 response: PhantomData
94 }
95 }
96}