mexc_rs/spot/v3/
keep_alive_user_data_stream.rs

1use crate::spot::v3::{ApiResponse, ApiResult};
2use crate::spot::MexcSpotApiClientWithAuthentication;
3use async_trait::async_trait;
4use chrono::{DateTime, Utc};
5
6#[derive(Debug)]
7pub struct KeepAliveUserDataStreamParams<'a> {
8    pub listen_key: &'a str,
9}
10
11#[derive(Debug, serde::Serialize)]
12#[serde(rename_all = "camelCase")]
13pub struct KeepAliveUserDataStreamQuery<'a> {
14    #[serde(with = "chrono::serde::ts_milliseconds")]
15    timestamp: DateTime<Utc>,
16    listen_key: &'a str,
17}
18
19#[derive(Debug, serde::Deserialize)]
20#[serde(rename_all = "camelCase")]
21pub struct KeepAliveUserDataStreamOutput {
22    pub listen_key: String,
23}
24
25#[async_trait]
26pub trait KeepAliveUserDataStreamEndpoint {
27    async fn keep_alive_user_data_stream(
28        &self,
29        params: KeepAliveUserDataStreamParams<'_>,
30    ) -> ApiResult<KeepAliveUserDataStreamOutput>;
31}
32
33#[async_trait]
34impl KeepAliveUserDataStreamEndpoint for MexcSpotApiClientWithAuthentication {
35    async fn keep_alive_user_data_stream(
36        &self,
37        params: KeepAliveUserDataStreamParams<'_>,
38    ) -> ApiResult<KeepAliveUserDataStreamOutput> {
39        let url = format!("{}/api/v3/userDataStream", self.endpoint.as_ref());
40        let query = KeepAliveUserDataStreamQuery {
41            timestamp: Utc::now(),
42            listen_key: params.listen_key,
43        };
44        let query = self.sign_query(&query)?;
45        let response = self.reqwest_client.put(&url).query(&query).send().await?;
46        let api_response = response
47            .json::<ApiResponse<KeepAliveUserDataStreamOutput>>()
48            .await?;
49        let output = api_response.into_api_result()?;
50
51        Ok(output)
52    }
53}