use reqwest::Method;
use serde::{Deserialize, Serialize};
use crate::{enums::TickerType, rest_api::endpoint, web_socket_api::web_socket};
use super::{TickerFull, TickerMini};
endpoint!(
"/api/v3/ticker",
Method::GET,
RollingWindowPriceChangeEndpoint,
RollingWindowPriceChangeParams,
RollingWindowPriceChangeResponse
);
pub struct RollingWindowPriceChangeEndpoint<'r> {
client: &'r crate::rest_api::RestApiClient,
}
impl<'r> RollingWindowPriceChangeEndpoint<'r> {
pub fn new(client: &'r crate::rest_api::RestApiClient) -> Self {
Self { client }
}
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RollingWindowPriceChangeParams {
#[serde(skip_serializing_if = "Option::is_none")]
symbol: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
symbols: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
window_size: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
r#type: Option<TickerType>,
}
impl Default for RollingWindowPriceChangeParams {
fn default() -> Self {
Self::new()
}
}
impl RollingWindowPriceChangeParams {
pub fn new() -> Self {
Self {
symbol: None,
symbols: None,
window_size: None,
r#type: None,
}
}
pub fn symbol(mut self, symbol: &str) -> Self {
self.symbol = Some(symbol.to_owned());
self
}
pub fn symbols(mut self, symbols: &[&str]) -> Self {
self.symbols = Some(symbols.iter().map(|s| s.to_string()).collect());
self
}
pub fn window_size(mut self, window_size: &str) -> Self {
self.window_size = Some(window_size.to_owned());
self
}
pub fn r#type(mut self, r#type: TickerType) -> Self {
self.r#type = Some(r#type);
self
}
}
#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub enum RollingWindowPriceChangeResponse {
Full(Box<TickerFull>),
FullVec(Box<Vec<TickerFull>>),
Mini(Box<TickerMini>),
MiniVec(Box<Vec<TickerMini>>),
}
web_socket!(
"ticker",
RollingWindowPriceChangeWebSocket,
RollingWindowPriceChangeParams,
RollingWindowPriceChangeResponse
);
pub struct RollingWindowPriceChangeWebSocket<'w> {
client: &'w crate::web_socket_api::WebSocketApiClient,
}
impl<'w> RollingWindowPriceChangeWebSocket<'w> {
pub fn new(client: &'w crate::web_socket_api::WebSocketApiClient) -> Self {
Self { client }
}
}