decthings_api/client/rpc/language/
mod.rs1mod request;
2mod response;
3
4use crate::client::StateModification;
5
6pub use request::*;
7pub use response::*;
8
9pub struct LanguageRpc {
10 rpc: crate::client::DecthingsClientRpc,
11}
12
13impl LanguageRpc {
14 pub(crate) fn new(rpc: crate::client::DecthingsClientRpc) -> Self {
15 Self { rpc }
16 }
17
18 pub async fn start_language_server(
19 &self,
20 params: StartLanguageServerParams<'_>,
21 ) -> Result<StartLanguageServerResult, crate::client::DecthingsRpcError<StartLanguageServerError>>
22 {
23 let (tx, rx) = tokio::sync::oneshot::channel();
24 self.rpc
25 .raw_method_call::<_, _, &[u8]>(
26 "Language",
27 "startLanguageServer",
28 params,
29 &[],
30 crate::client::RpcProtocol::Ws,
31 move |x| {
32 match x {
33 Ok(val) => {
34 let res: Result<
35 super::Response<
36 StartLanguageServerResult,
37 StartLanguageServerError,
38 >,
39 crate::client::DecthingsRpcError<StartLanguageServerError>,
40 > = serde_json::from_slice(&val.0).map_err(Into::into);
41 match res {
42 Ok(super::Response::Result(val)) => {
43 let language_server_id = val.language_server_id.clone();
44 tx.send(Ok(val)).ok();
45 return StateModification {
46 add_events: vec![language_server_id],
47 remove_events: vec![],
48 };
49 }
50 Ok(super::Response::Error(val)) => {
51 tx.send(Err(crate::client::DecthingsRpcError::Rpc(val)))
52 .ok();
53 }
54 Err(e) => {
55 tx.send(Err(e)).ok();
56 }
57 }
58 }
59 Err(err) => {
60 tx.send(Err(err.into())).ok();
61 }
62 }
63 StateModification::empty()
64 },
65 )
66 .await;
67 rx.await.unwrap()
68 }
69
70 pub async fn write_to_language_server(
71 &self,
72 params: WriteToLanguageServerParams<'_, impl AsRef<[u8]>>,
73 ) -> Result<
74 WriteToLanguageServerResult,
75 crate::client::DecthingsRpcError<WriteToLanguageServerError>,
76 > {
77 let (tx, rx) = tokio::sync::oneshot::channel();
78 let did_call = self
79 .rpc
80 .raw_method_call(
81 "Language",
82 "writeToLanguageServer",
83 ¶ms,
84 [params.data.as_ref()],
85 crate::client::RpcProtocol::WsIfAvailableOtherwiseNone,
86 |x| {
87 tx.send(x).ok();
88 StateModification::empty()
89 },
90 )
91 .await;
92 if !did_call {
93 return Err(crate::client::DecthingsRpcError::Rpc(
94 WriteToLanguageServerError::LanguageServerNotFound,
95 ));
96 }
97 rx.await
98 .unwrap()
99 .map_err(crate::client::DecthingsRpcError::Request)
100 .and_then(|x| {
101 let res: super::Response<WriteToLanguageServerResult, WriteToLanguageServerError> =
102 serde_json::from_slice(&x.0)?;
103 match res {
104 super::Response::Result(val) => Ok(val),
105 super::Response::Error(val) => Err(crate::client::DecthingsRpcError::Rpc(val)),
106 }
107 })
108 }
109
110 pub async fn unsubscribe_from_events(
111 &self,
112 params: LanguageUnsubscribeFromEventsParams<'_>,
113 ) -> Result<
114 LanguageUnsubscribeFromEventsResult,
115 crate::client::DecthingsRpcError<LanguageUnsubscribeFromEventsError>,
116 > {
117 let (tx, rx) = tokio::sync::oneshot::channel();
118 let language_server_id_owned = params.language_server_id.to_owned();
119 let did_call = self
120 .rpc
121 .raw_method_call::<_, _, &[u8]>(
122 "Language",
123 "unsubscribeFromEvents",
124 params,
125 &[],
126 crate::client::RpcProtocol::WsIfAvailableOtherwiseNone,
127 move |x| {
128 match x {
129 Ok(val) => {
130 let res: Result<
131 super::Response<
132 LanguageUnsubscribeFromEventsResult,
133 LanguageUnsubscribeFromEventsError,
134 >,
135 crate::client::DecthingsRpcError<
136 LanguageUnsubscribeFromEventsError,
137 >,
138 > = serde_json::from_slice(&val.0).map_err(Into::into);
139 match res {
140 Ok(super::Response::Result(val)) => {
141 tx.send(Ok(val)).ok();
142 return StateModification {
143 add_events: vec![],
144 remove_events: vec![language_server_id_owned],
145 };
146 }
147 Ok(super::Response::Error(val)) => {
148 tx.send(Err(crate::client::DecthingsRpcError::Rpc(val)))
149 .ok();
150 }
151 Err(e) => {
152 tx.send(Err(e)).ok();
153 }
154 }
155 }
156 Err(err) => {
157 tx.send(Err(err.into())).ok();
158 }
159 }
160 StateModification::empty()
161 },
162 )
163 .await;
164 if !did_call {
165 return Err(crate::client::DecthingsRpcError::Rpc(
166 LanguageUnsubscribeFromEventsError::NotSubscribed,
167 ));
168 }
169 rx.await.unwrap()
170 }
171}