trading_ig/client_sentiment/
api.rs1use http::Method;
4use serde::Deserialize;
5use tracing::instrument;
6
7use crate::Result;
8use crate::client::IgClient;
9
10use super::models::Sentiment;
11
12#[derive(Debug)]
16pub struct ClientSentimentApi<'a> {
17 pub(crate) client: &'a IgClient,
18}
19
20#[derive(Deserialize)]
21#[serde(rename_all = "camelCase")]
22struct SentimentEnvelope {
23 client_sentiments: Vec<Sentiment>,
24}
25
26impl ClientSentimentApi<'_> {
27 #[instrument(skip(self), fields(market_id = %market_id))]
35 pub async fn get(&self, market_id: &str) -> Result<Sentiment> {
36 let path = format!("clientsentiment/{market_id}");
37 self.client
38 .transport
39 .request::<(), Sentiment>(
40 Method::GET,
41 &path,
42 Some(1),
43 None::<&()>,
44 &self.client.session,
45 )
46 .await
47 }
48
49 #[instrument(skip(self), fields(count = market_ids.len()))]
54 pub async fn get_many(&self, market_ids: &[&str]) -> Result<Vec<Sentiment>> {
55 let ids = market_ids.join(",");
56 let path = format!("clientsentiment?marketIds={ids}");
57 let envelope: SentimentEnvelope = self
58 .client
59 .transport
60 .request(
61 Method::GET,
62 &path,
63 Some(1),
64 None::<&()>,
65 &self.client.session,
66 )
67 .await?;
68 Ok(envelope.client_sentiments)
69 }
70
71 #[instrument(skip(self), fields(market_id = %market_id))]
76 pub async fn related(&self, market_id: &str) -> Result<Vec<Sentiment>> {
77 let path = format!("clientsentiment/related/{market_id}");
78 let envelope: SentimentEnvelope = self
79 .client
80 .transport
81 .request(
82 Method::GET,
83 &path,
84 Some(1),
85 None::<&()>,
86 &self.client.session,
87 )
88 .await?;
89 Ok(envelope.client_sentiments)
90 }
91}