cometd_client/client/
subscribe.rs1use crate::{
2 types::{Advice, CometdError, CometdResult, ErrorKind, Message},
3 CometdClientInner,
4};
5use serde_json::{json, Value as JsonValue};
6
7impl CometdClientInner {
8 pub(crate) async fn subscribe(&self, subscriptions: &JsonValue) -> CometdResult<()> {
9 const KIND: ErrorKind = ErrorKind::Subscribe;
10
11 let client_id = self
12 .client_id
13 .load_full()
14 .ok_or_else(|| CometdError::MissingClientId(KIND))?;
15 let body = json!([{
16 "id": self.next_id(),
17 "channel": "/meta/subscribe",
18 "subscription": subscriptions,
19 "clientId": *client_id
20 }])
21 .to_string();
22
23 let request_builder = self.create_request_builder(&self.subscribe_endpoint);
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}