From aa9e255755678d7ef4e148fe2bafcfe8fdb75e6f Mon Sep 17 00:00:00 2001 From: Oskar Gottlieb Date: Wed, 18 Jan 2023 22:48:01 -0600 Subject: [PATCH] add public/get_last_trades_by_currency method, allow for pagination results. --- README.md | 2 +- src/api_client.rs | 2 +- src/models/jsonrpc.rs | 4 +-- src/models/market_data.rs | 73 ++++++++++++++++++++++++++++++++++++++- src/models/mod.rs | 41 ++++++++++++++++++++++ 5 files changed, 117 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d414c37..87d469d 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,7 @@ while let Some(message) = subscription.next().await { - [x] /public/get_instruments - [ ] /public/get_last_settlements_by_currency - [ ] /public/get_last_settlements_by_instrument - - [ ] /public/get_last_trades_by_currency + - [X] /public/get_last_trades_by_currency - [ ] /public/get_last_trades_by_currency_and_time - [ ] /public/get_last_trades_by_instrument - [ ] /public/get_last_trades_by_instrument_and_time diff --git a/src/api_client.rs b/src/api_client.rs index b6616e4..acbb016 100644 --- a/src/api_client.rs +++ b/src/api_client.rs @@ -1,5 +1,5 @@ use crate::errors::{DeribitError, Result}; -use crate::models::{JSONRPCRequest, JSONRPCResponse, Request}; +use crate::models::{JSONRPCRequest, JSONRPCResponse, Request, WithPagination}; use crate::WSStream; use anyhow::Error; use fehler::throws; diff --git a/src/models/jsonrpc.rs b/src/models/jsonrpc.rs index 049eabb..7a81cbb 100644 --- a/src/models/jsonrpc.rs +++ b/src/models/jsonrpc.rs @@ -1,4 +1,4 @@ -use crate::models::{Either, Request}; +use crate::models::{Either, EitherWrapper, Request}; use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize, Clone, Debug)] @@ -16,7 +16,7 @@ pub struct JSONRPCResponse { pub id: i64, pub testnet: bool, #[serde(alias = "error")] - pub result: Either, + pub result: EitherWrapper, pub us_in: u64, pub us_out: u64, pub us_diff: u64, diff --git a/src/models/market_data.rs b/src/models/market_data.rs index c0b4b0f..5d8c4d2 100644 --- a/src/models/market_data.rs +++ b/src/models/market_data.rs @@ -1,4 +1,4 @@ -use crate::models::{AssetKind, Currency, Request}; +use crate::models::{AssetKind, Currency, Direction, Request, Sorting}; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -246,3 +246,74 @@ pub enum State { #[serde(alias = "closed")] Closed, } + +#[derive(Deserialize, Serialize, Clone, Debug, Default)] +pub struct GetLastTradesByCurrencyRequest { + pub currency: Currency, + #[serde(skip_serializing_if = "Option::is_none")] + pub kind: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub start_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub end_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub count: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub include_old: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub sorting: Option, +} + +impl GetLastTradesByCurrencyRequest { + pub fn new(currency: Currency) -> Self { + Self { + currency, + ..Default::default() + } + } + + pub fn include_old(currency: Currency) -> Self { + Self { + currency, + include_old: Some(true), + ..Default::default() + } + } + + pub fn futures(currency: Currency) -> Self { + Self::with_kind(currency, AssetKind::Future) + } + + pub fn options(currency: Currency) -> Self { + Self::with_kind(currency, AssetKind::Option) + } + + pub fn with_kind(currency: Currency, kind: AssetKind) -> Self { + Self { + currency, + kind: Some(kind), + ..Default::default() + } + } +} + +#[derive(Deserialize, Serialize, Clone, Debug)] +pub struct GetLastTradesByCurrencyResponse { + pub amount: Option, + pub block_trade_id: Option, + pub direction: Direction, + pub index_price: f64, + pub instrument_name: String, + pub iv: Option, + pub mark_price: f64, + pub price: f64, + pub trade_id: String, + pub timestamp: u64, + pub trade_seq: u64, + pub tick_direction: i64, +} + +impl Request for GetLastTradesByCurrencyRequest { + const METHOD: &'static str = "public/get_last_trades_by_currency"; + type Response = Vec; +} diff --git a/src/models/mod.rs b/src/models/mod.rs index 2901c98..1493865 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -361,6 +361,22 @@ impl Either { } } +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct WithPagination { + #[serde(alias = "trades")] + pub values: Either, + pub has_more: bool, +} + +impl WithPagination { + pub fn left_result(self) -> StdResult { + match self.values { + Either::Left(l) => Ok(l), + Either::Right(r) => Err(r), + } + } +} + #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(untagged)] pub enum Any3 { @@ -485,3 +501,28 @@ pub enum Any12 { Eleventh(O11), Twelfth(O12), } + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum Sorting { + #[serde(rename = "asc")] + Asc, + #[serde(rename = "default")] + Default, + #[serde(rename = "desc")] + Desc, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum EitherWrapper { + with_pagination(WithPagination), + no_pagination(Either), +} +impl EitherWrapper { + pub fn left_result(self) -> StdResult { + match self { + EitherWrapper::with_pagination(l) => l.left_result(), + EitherWrapper::no_pagination(r) => r.left_result(), + } + } +}