Sends a [ButtplugClientMessage] to be parsed by the server (for handshake or ping), or passed into the server's [DeviceManager] for communication with devices.
(
&self,
msg: ButtplugClientMessageVariant,
)
| 240 | /// Sends a [ButtplugClientMessage] to be parsed by the server (for handshake or ping), or passed |
| 241 | /// into the server's [DeviceManager] for communication with devices. |
| 242 | pub fn parse_message( |
| 243 | &self, |
| 244 | msg: ButtplugClientMessageVariant, |
| 245 | ) -> BoxFuture<'static, Result<ButtplugServerMessageVariant, ButtplugServerMessageVariant>> { |
| 246 | let features = self.device_manager().feature_map(); |
| 247 | let msg_id = msg.id(); |
| 248 | trace!("Server received: {:?}", msg); |
| 249 | let v = msg.version(); |
| 250 | let spec_version = if let Some(current_version) = self.spec_version() { |
| 251 | current_version |
| 252 | } else { |
| 253 | info!("Setting Buttplug Server Message Spec version to {}", v); |
| 254 | v |
| 255 | }; |
| 256 | match msg { |
| 257 | ButtplugClientMessageVariant::V4(msg) => { |
| 258 | let internal_msg = |
| 259 | match ButtplugCheckedClientMessageV4::try_from_client_message(msg, &features) { |
| 260 | Ok(m) => m, |
| 261 | Err(e) => { |
| 262 | let mut err_msg = ErrorV0::from(e); |
| 263 | err_msg.set_id(msg_id); |
| 264 | return future::ready(Err(ButtplugServerMessageVariant::from( |
| 265 | ButtplugServerMessageV4::from(err_msg), |
| 266 | ))) |
| 267 | .boxed(); |
| 268 | } |
| 269 | }; |
| 270 | let fut = self.parse_checked_message(internal_msg); |
| 271 | async move { |
| 272 | Ok( |
| 273 | fut |
| 274 | .await |
| 275 | .map_err(|e| ButtplugServerMessageVariant::from(ButtplugServerMessageV4::from(e)))? |
| 276 | .into(), |
| 277 | ) |
| 278 | } |
| 279 | .boxed() |
| 280 | } |
| 281 | msg => { |
| 282 | let converter = ButtplugServerMessageConverter::new(Some(msg.clone())); |
| 283 | match ButtplugCheckedClientMessageV4::try_from_client_message(msg, &features) { |
| 284 | Ok(converted_msg) => { |
| 285 | trace!("Converted message: {:?}", converted_msg); |
| 286 | let fut = self.parse_checked_message(converted_msg); |
| 287 | async move { |
| 288 | let result = fut.await.map_err(|e| { |
| 289 | converter |
| 290 | .convert_outgoing(&e.into(), &spec_version) |
| 291 | .unwrap() |
| 292 | })?; |
| 293 | let out_msg = converter |
| 294 | .convert_outgoing(&result, &spec_version) |
| 295 | .map_err(|e| { |
| 296 | converter |
| 297 | .convert_outgoing( |
| 298 | &ButtplugServerMessageV4::from(ErrorV0::from(e)), |
| 299 | &spec_version, |