use crate::{
v5::api::{
BybitApi,
get::Get,
},
utils::{
deserialize_f64,
deserialize_string_to_u64,
},
};
use serde::{
Serialize,
Deserialize,
};
use serde_json::Value;
use anyhow::Result;
const PATH: &'static str = "/v5/market/kline";
impl BybitApi {
pub async fn get_kline(&self, params: GetKlineParameters) -> Result<GetKlineResponse> {
self.get(PATH, Some(params), false).await
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum GetKlineCategory {
Linear,
Spot,
Inverse,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetKlineParameters {
category: GetKlineCategory,
symbol: String,
interval: String,
start: Option<u64>,
end: Option<u64>,
limit: Option<u32>,
}
impl GetKlineParameters {
pub fn new(category: GetKlineCategory, symbol: String, interval: String) -> Self {
Self {
category,
symbol,
interval,
start: None,
end: None,
limit: None,
}
}
pub fn with_start(mut self, start: u64) -> Self {
self.start = Some(start);
self
}
pub fn with_end(mut self, end: u64) -> Self {
self.end = Some(end);
self
}
pub fn with_limit(mut self, limit: u32) -> Self {
self.limit = Some(limit);
self
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetKlineResponse {
ret_code: i32,
ret_msg: String,
result: KlineResult,
ret_ext_info: Value,
time: u64,
}
impl GetKlineResponse {
pub fn ret_code(&self) -> i32 {
self.ret_code
}
pub fn set_ret_code(&mut self, ret_code: i32) {
self.ret_code = ret_code;
}
pub fn ret_msg(&self) -> &str {
&self.ret_msg
}
pub fn set_ret_msg(&mut self, ret_msg: String) {
self.ret_msg = ret_msg;
}
pub fn result(&self) -> &KlineResult {
&self.result
}
pub fn set_result(&mut self, result: KlineResult) {
self.result = result;
}
pub fn ret_ext_info(&self) -> &Value {
&self.ret_ext_info
}
pub fn set_ret_ext_info(&mut self, ret_ext_info: Value) {
self.ret_ext_info = ret_ext_info;
}
pub fn time(&self) -> u64 {
self.time
}
pub fn set_time(&mut self, time: u64) {
self.time = time;
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct KlineResult {
symbol: String,
category: String,
list: Vec<Kline>
}
impl KlineResult {
pub fn symbol(&self) -> &str {
&self.symbol
}
pub fn set_symbol(&mut self, symbol: String) {
self.symbol = symbol;
}
pub fn category(&self) -> &str {
&self.category
}
pub fn set_category(&mut self, category: String) {
self.category = category;
}
pub fn list(&self) -> &Vec<Kline> {
&self.list
}
pub fn set_list(&mut self, list: Vec<Kline>) {
self.list = list;
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct Kline {
#[serde(rename = "0", deserialize_with = "deserialize_string_to_u64")]
timestamp: u64,
#[serde(rename = "1", deserialize_with = "deserialize_f64")]
open: f64,
#[serde(rename = "2", deserialize_with = "deserialize_f64")]
high: f64,
#[serde(rename = "3", deserialize_with = "deserialize_f64")]
low: f64,
#[serde(rename = "4", deserialize_with = "deserialize_f64")]
close: f64,
#[serde(rename = "5", deserialize_with = "deserialize_f64")]
volume: f64,
#[serde(rename = "6", deserialize_with = "deserialize_f64")]
turnover: f64,
}
impl Kline {
pub fn timestamp(&self) -> u64 {
self.timestamp
}
pub fn set_timestamp(&mut self, timestamp: u64) {
self.timestamp = timestamp;
}
pub fn open(&self) -> f64 {
self.open
}
pub fn set_open(&mut self, open: f64) {
self.open = open;
}
pub fn high(&self) -> f64 {
self.high
}
pub fn set_high(&mut self, high: f64) {
self.high = high;
}
pub fn low(&self) -> f64 {
self.low
}
pub fn set_low(&mut self, low: f64) {
self.low = low;
}
pub fn close(&self) -> f64 {
self.close
}
pub fn set_close(&mut self, close: f64) {
self.close = close;
}
pub fn volume(&self) -> f64 {
self.volume
}
pub fn set_volume(&mut self, volume: f64) {
self.volume = volume;
}
pub fn turnover(&self) -> f64 {
self.turnover
}
pub fn set_turnover(&mut self, turnover: f64) {
self.turnover = turnover;
}
}