bybit_rust_api/rest/announcements/
announcements_client.rs

1use crate::rest::client::{RestClient, SecType, ServerResponse};
2use serde::Deserialize;
3use serde_json::json;
4
5#[derive(Clone)]
6pub struct AnnouncementsClient {
7    client: RestClient,
8}
9
10#[derive(Debug, Deserialize)]
11struct AnnouncementsResponse {
12    #[serde(rename = "retCode")]
13    ret_code: i32,
14    #[serde(rename = "retMsg")]
15    ret_msg: String,
16    #[serde(rename = "result", default)]
17    result: serde_json::Value,
18    #[serde(rename = "retExtInfo")]
19    ret_ext_info: serde_json::Value,
20    #[serde(rename = "time")]
21    time: i64,
22}
23
24impl From<AnnouncementsResponse> for ServerResponse<serde_json::Value> {
25    fn from(r: AnnouncementsResponse) -> Self {
26        ServerResponse {
27            ret_code: r.ret_code,
28            ret_msg: r.ret_msg,
29            result: r.result,
30            ret_ext_info: r.ret_ext_info,
31            time: r.time,
32        }
33    }
34}
35
36impl AnnouncementsClient {
37    pub fn new(client: RestClient) -> Self {
38        AnnouncementsClient { client }
39    }
40
41    /// Get announcements
42    /// https://bybit-exchange.github.io/docs/v5/announcement
43    pub async fn get_announcements(
44        &self,
45        locale: Option<&str>,
46        type_list: Option<&str>,
47        tag: Option<&str>,
48        page: Option<i32>,
49        limit: Option<i32>,
50    ) -> crate::rest::BybitResult<ServerResponse<serde_json::Value>> {
51        let endpoint = "v5/announcements/index";
52        let mut params = json!({});
53
54        if let Some(locale) = locale {
55            params["locale"] = json!(locale);
56        }
57        if let Some(type_list) = type_list {
58            params["type"] = json!(type_list);
59        }
60        if let Some(tag) = tag {
61            params["tag"] = json!(tag);
62        }
63        if let Some(page) = page {
64            params["page"] = json!(page);
65        }
66        if let Some(limit) = limit {
67            params["limit"] = json!(limit);
68        }
69
70        self.client.get(endpoint, params, SecType::None).await
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77    use crate::rest::ApiKeyPair;
78
79    fn create_test_client() -> AnnouncementsClient {
80        let api_key_pair = ApiKeyPair::new(
81            "test".to_string(),
82            "test_key".to_string(),
83            "test_secret".to_string(),
84        );
85        let rest_client =
86            RestClient::new(api_key_pair, "https://api-testnet.bybit.com".to_string());
87        AnnouncementsClient::new(rest_client)
88    }
89
90    #[test]
91    fn test_announcements_client_creation() {
92        let _client = create_test_client();
93    }
94
95    #[tokio::test]
96    async fn test_get_announcements_params() {
97        let locale = Some("en-US");
98        let type_list = Some("new_crypto");
99        let tag = Some("Spot");
100        let page = Some(1);
101        let limit = Some(20);
102
103        assert_eq!(locale, Some("en-US"));
104        assert_eq!(type_list, Some("new_crypto"));
105        assert_eq!(tag, Some("Spot"));
106        assert_eq!(page, Some(1));
107        assert_eq!(limit, Some(20));
108    }
109}