1use futures_util::stream;
2use tonic::transport::Channel;
3use tonic::Request;
4use tonic::Streaming;
5
6use crate::core::core_api_client::CoreApiClient;
7use crate::core::*;
8use crate::mobility::*;
9
10pub struct Client {
11 inner: CoreApiClient<Channel>,
12}
13
14impl Client {
15 pub async fn connect(core_addr: String) -> Result<Self, tonic::transport::Error> {
16 Ok(Client {
17 inner: CoreApiClient::connect(core_addr).await?,
18 })
19 }
20
21 pub fn inner(&mut self) -> &mut CoreApiClient<Channel> {
22 &mut self.inner
23 }
24
25 pub async fn get_sessions(
26 &mut self,
27 ) -> Result<Vec<crate::core::SessionSummary>, tonic::Status> {
28 let request = tonic::Request::new(GetSessionsRequest {});
29
30 Ok(self
31 .inner()
32 .get_sessions(request)
33 .await?
34 .into_inner()
35 .sessions)
36 }
37
38 pub async fn get_session(
39 &mut self,
40 session_id: i32,
41 ) -> Result<Option<crate::core::Session>, tonic::Status> {
42 let request = tonic::Request::new(GetSessionRequest { session_id });
43 Ok(self
44 .inner()
45 .get_session(request)
46 .await?
47 .into_inner()
48 .session)
49 }
50
51 pub async fn get_node(
52 &mut self,
53 session_id: i32,
54 node_id: i32,
55 ) -> Result<crate::core::GetNodeResponse, tonic::Status> {
56 let request = tonic::Request::new(GetNodeRequest {
57 session_id,
58 node_id,
59 });
60 Ok(self.inner().get_node(request).await?.into_inner())
61 }
62 pub async fn edit_node(
63 &mut self,
64 session_id: i32,
65 node_id: i32,
66 position: Option<crate::core::Position>,
67 icon: String,
68 source: String,
69 geo: Option<crate::core::Geo>,
70 ) -> Result<crate::core::EditNodeResponse, tonic::Status> {
71 let request = tonic::Request::new(EditNodeRequest {
72 session_id,
73 node_id,
74 position,
75 icon,
76 source,
77 geo,
78 });
79 Ok(self.inner().edit_node(request).await?.into_inner())
80 }
81 pub async fn create_session(
82 &mut self,
83 session_id: i32,
84 ) -> Result<crate::core::CreateSessionResponse, tonic::Status> {
85 let request = tonic::Request::new(CreateSessionRequest { session_id });
86 Ok(self.inner().create_session(request).await?.into_inner())
87 }
88 pub async fn stop_session(
89 &mut self,
90 session_id: i32,
91 ) -> Result<crate::core::StopSessionResponse, tonic::Status> {
92 let request = tonic::Request::new(StopSessionRequest { session_id });
93 Ok(self.inner().stop_session(request).await?.into_inner())
94 }
95 pub async fn open_xml(
96 &mut self,
97 data: String,
98 start: bool,
99 file: String,
100 ) -> Result<crate::core::OpenXmlResponse, tonic::Status> {
101 let request = tonic::Request::new(OpenXmlRequest { data, start, file });
102 Ok(self.inner().open_xml(request).await?.into_inner())
103 }
104 pub async fn save_xml(
105 &mut self,
106 session_id: i32,
107 ) -> Result<crate::core::SaveXmlResponse, tonic::Status> {
108 let request = tonic::Request::new(SaveXmlRequest { session_id });
109 Ok(self.inner().save_xml(request).await?.into_inner())
110 }
111
112 pub async fn execute_script(
113 &mut self,
114 script: String,
115 ) -> Result<crate::core::ExecuteScriptResponse, tonic::Status> {
116 let request = tonic::Request::new(ExecuteScriptRequest { script });
117 Ok(self.inner().execute_script(request).await?.into_inner())
118 }
119
120 pub async fn node_command(
121 &mut self,
122 session_id: i32,
123 node_id: i32,
124 command: String,
125 wait: bool,
126 shell: bool,
127 ) -> Result<crate::core::NodeCommandResponse, tonic::Status> {
128 let request = tonic::Request::new(NodeCommandRequest {
129 session_id,
130 node_id,
131 command,
132 wait,
133 shell,
134 });
135 Ok(self.inner().node_command(request).await?.into_inner())
136 }
137 pub async fn move_nodes(
138 &mut self,
139 moves: Vec<MoveNodesRequest>,
140 ) -> Result<crate::core::MoveNodesResponse, tonic::Status> {
141 Ok(self
148 .inner()
149 .move_nodes(stream::iter(moves))
150 .await?
151 .into_inner())
152 }
153 pub async fn mobility_action(
154 &mut self,
155 session_id: i32,
156 node_id: i32,
157 action: crate::mobility::mobility_action::Enum,
158 ) -> Result<MobilityActionResponse, tonic::Status> {
159 let request = Request::new(MobilityActionRequest {
160 session_id,
161 node_id,
162 action: action as i32,
163 });
164 Ok(self.inner().mobility_action(request).await?.into_inner())
165 }
166
167 pub async fn events(
168 &mut self,
169 session_id: i32,
170 events: Vec<event_type::Enum>,
171 ) -> Result<Streaming<Event>, tonic::Status> {
172 let request = tonic::Request::new(EventsRequest {
173 session_id,
174 events: events.iter().map(|e| *e as i32).collect(),
175 });
176 Ok(self.inner().events(request).await?.into_inner())
177 }
178}