cometd_client/client/
disconnect.rs1use crate::{
2 types::{Advice, CometdError, CometdResult, ErrorKind, Message},
3 CometdClientInner,
4};
5use serde_json::json;
6
7impl CometdClientInner {
8 pub(crate) async fn disconnect(&self) -> CometdResult<()> {
9 const KIND: ErrorKind = ErrorKind::Disconnect;
10
11 let client_id = self
12 .client_id
13 .swap(None)
14 .ok_or_else(|| CometdError::MissingClientId(KIND))?;
15 let body = json!([{
16 "id": self.next_id(),
17 "channel": "/meta/disconnect",
18 "clientId": *client_id
19 }])
20 .to_string();
21
22 let request_builder = self.create_request_builder(&self.disconnect_endpoint);
23
24 let Message {
25 successful,
26 error,
27 advice,
28 ..
29 } = self
30 .send_request_and_parse_json_body::<[Message; 1]>(request_builder, body, KIND)
31 .await
32 .map(|[message]| message)?;
33
34 if successful == Some(false) {
35 Err(CometdError::wrong_response(
36 KIND,
37 Advice::reconnect(advice),
38 error.unwrap_or_default(),
39 ))
40 } else {
41 Ok(())
42 }
43 }
44}