use super::*;
use reqwest::Client;
pub mod assets;
mod auth;
pub mod cancel_order;
pub mod cancel_orders;
pub mod create_order;
pub mod deposit_history;
pub mod fetch_active_orders;
pub mod fetch_order;
pub mod fetch_orders;
pub mod trade_history;
pub use auth::Credential;
struct ApiExec {
cred: auth::Credential,
}
impl ApiExec {
async fn get<R: serde::de::DeserializeOwned>(
self,
path: impl Into<String>,
params: String,
) -> anyhow::Result<R> {
let path = path.into();
let params = if params.len() > 0 {
format!("?{params}")
} else {
format!("")
};
let auth_headers = auth::GetAuth {
path: path.clone(),
params: params.clone(),
}
.create(self.cred)?;
let url = format!("https://api.bitbank.cc{path}{params}");
let (cli, req) = Client::new().get(url).headers(auth_headers).build_split();
let resp: Response = cli.execute(req?).await?.json().await?;
let data = resp.result()?;
let data: R = serde_json::from_value(data)?;
Ok(data)
}
async fn post<R: serde::de::DeserializeOwned>(
self,
path: impl Into<String>,
body: String,
) -> anyhow::Result<R> {
let path = path.into();
let auth_headers = auth::PostAuth { body: body.clone() }.create(self.cred)?;
let url = format!("https://api.bitbank.cc{path}");
let (cli, req) = Client::new()
.post(url)
.headers(auth_headers)
.body(body)
.build_split();
let resp: Response = cli.execute(req?).await?.json().await?;
let data = resp.result()?;
let data: R = serde_json::from_value(data)?;
Ok(data)
}
}
#[serde_as]
#[derive(Deserialize, Debug)]
pub struct OrderInfo {
pub order_id: u64,
#[serde_as(as = "DisplayFromStr")]
pub pair: Pair,
#[serde_as(as = "DisplayFromStr")]
pub side: Side,
#[serde_as(as = "DisplayFromStr")]
#[serde(rename = "type")]
pub order_type: OrderType,
#[serde_as(as = "DisplayFromStr")]
pub start_amount: f64,
#[serde_as(as = "DisplayFromStr")]
pub remaining_amount: f64,
#[serde_as(as = "DisplayFromStr")]
pub executed_amount: f64,
#[serde_as(as = "DisplayFromStr")]
pub price: f64,
#[serde_as(deserialize_as = "DefaultOnNull")]
pub post_only: Option<bool>,
#[serde_as(as = "DisplayFromStr")]
pub average_price: f64,
#[serde_as(as = "TimestampMilliSeconds")]
pub ordered_at: NaiveDateTime,
#[serde_as(as = "Option<TimestampMilliSeconds>")]
pub expire_at: Option<NaiveDateTime>,
#[serde_as(as = "Option<TimestampMilliSeconds>")]
pub triggered_at: Option<NaiveDateTime>,
#[serde_as(as = "Option<DisplayFromStr>")]
pub trigger_price: Option<f64>,
#[serde_as(as = "Option<TimestampMilliSeconds>")]
pub canceled_at: Option<NaiveDateTime>,
#[serde_as(as = "DisplayFromStr")]
pub status: OrderStatus,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_url_parse() -> anyhow::Result<()> {
let url = format!("https://api.bitbank.cc/v1/some_api?a=b&c=d");
let cli = Client::new();
let req = cli.get(url).build()?;
dbg!(&req);
Ok(())
}
}