use std::collections::HashMap;
use std::future::Future;
use rust_decimal::Decimal;
use crate::error::KrakenError;
use crate::spot::rest::private::{
AddOrderRequest, AddOrderResponse, AllocationStatus, CancelOrderRequest, CancelOrderResponse,
ClosedOrders, ClosedOrdersRequest, ConfirmationRefId, DepositAddress, DepositAddressesRequest,
DepositMethod, DepositMethodsRequest, DepositStatusRequest, DepositWithdrawStatusResponse,
EarnAllocateRequest, EarnAllocationStatusRequest, EarnAllocations, EarnAllocationsRequest,
EarnStrategies, EarnStrategiesRequest, ExtendedBalances, LedgersInfo, LedgersRequest,
OpenOrders, OpenOrdersRequest, OpenPositionsRequest, Order, Position, QueryOrdersRequest,
TradeBalance, TradeBalanceRequest, TradeVolume, TradeVolumeRequest, TradesHistory,
TradesHistoryRequest, WalletTransferRequest, WebSocketToken, WithdrawAddressesRequest,
WithdrawCancelRequest, WithdrawInfo, WithdrawInfoRequest, WithdrawMethod,
WithdrawMethodsRequest, WithdrawRequest, WithdrawStatusRequest, WithdrawalAddress,
};
use crate::spot::rest::public::{
AssetInfo, AssetInfoRequest, AssetPair, AssetPairsRequest, OhlcRequest, OhlcResponse,
OrderBook, OrderBookRequest, RecentSpreadsRequest, RecentSpreadsResponse, RecentTradesRequest,
RecentTradesResponse, ServerTime, SystemStatus, TickerInfo,
};
pub trait KrakenClient: Send + Sync {
fn get_server_time(&self) -> impl Future<Output = Result<ServerTime, KrakenError>> + Send;
fn get_system_status(&self) -> impl Future<Output = Result<SystemStatus, KrakenError>> + Send;
fn get_assets(
&self,
request: Option<&AssetInfoRequest>,
) -> impl Future<Output = Result<HashMap<String, AssetInfo>, KrakenError>> + Send;
fn get_asset_pairs(
&self,
request: Option<&AssetPairsRequest>,
) -> impl Future<Output = Result<HashMap<String, AssetPair>, KrakenError>> + Send;
fn get_ticker(
&self,
pairs: &str,
) -> impl Future<Output = Result<HashMap<String, TickerInfo>, KrakenError>> + Send;
fn get_ohlc(
&self,
request: &OhlcRequest,
) -> impl Future<Output = Result<OhlcResponse, KrakenError>> + Send;
fn get_order_book(
&self,
request: &OrderBookRequest,
) -> impl Future<Output = Result<HashMap<String, OrderBook>, KrakenError>> + Send;
fn get_recent_trades(
&self,
request: &RecentTradesRequest,
) -> impl Future<Output = Result<RecentTradesResponse, KrakenError>> + Send;
fn get_recent_spreads(
&self,
request: &RecentSpreadsRequest,
) -> impl Future<Output = Result<RecentSpreadsResponse, KrakenError>> + Send;
fn get_account_balance(
&self,
) -> impl Future<Output = Result<HashMap<String, Decimal>, KrakenError>> + Send;
fn get_extended_balance(
&self,
) -> impl Future<Output = Result<ExtendedBalances, KrakenError>> + Send;
fn get_trade_balance(
&self,
request: Option<&TradeBalanceRequest>,
) -> impl Future<Output = Result<TradeBalance, KrakenError>> + Send;
fn get_open_orders(
&self,
request: Option<&OpenOrdersRequest>,
) -> impl Future<Output = Result<OpenOrders, KrakenError>> + Send;
fn get_closed_orders(
&self,
request: Option<&ClosedOrdersRequest>,
) -> impl Future<Output = Result<ClosedOrders, KrakenError>> + Send;
fn query_orders(
&self,
request: &QueryOrdersRequest,
) -> impl Future<Output = Result<HashMap<String, Order>, KrakenError>> + Send;
fn get_trades_history(
&self,
request: Option<&TradesHistoryRequest>,
) -> impl Future<Output = Result<TradesHistory, KrakenError>> + Send;
fn get_open_positions(
&self,
request: Option<&OpenPositionsRequest>,
) -> impl Future<Output = Result<HashMap<String, Position>, KrakenError>> + Send;
fn get_ledgers(
&self,
request: Option<&LedgersRequest>,
) -> impl Future<Output = Result<LedgersInfo, KrakenError>> + Send;
fn get_trade_volume(
&self,
request: Option<&TradeVolumeRequest>,
) -> impl Future<Output = Result<TradeVolume, KrakenError>> + Send;
fn get_deposit_methods(
&self,
request: &DepositMethodsRequest,
) -> impl Future<Output = Result<Vec<DepositMethod>, KrakenError>> + Send;
fn get_deposit_addresses(
&self,
request: &DepositAddressesRequest,
) -> impl Future<Output = Result<Vec<DepositAddress>, KrakenError>> + Send;
fn get_deposit_status(
&self,
request: Option<&DepositStatusRequest>,
) -> impl Future<Output = Result<DepositWithdrawStatusResponse, KrakenError>> + Send;
fn get_withdraw_methods(
&self,
request: Option<&WithdrawMethodsRequest>,
) -> impl Future<Output = Result<Vec<WithdrawMethod>, KrakenError>> + Send;
fn get_withdraw_addresses(
&self,
request: Option<&WithdrawAddressesRequest>,
) -> impl Future<Output = Result<Vec<WithdrawalAddress>, KrakenError>> + Send;
fn get_withdraw_info(
&self,
request: &WithdrawInfoRequest,
) -> impl Future<Output = Result<WithdrawInfo, KrakenError>> + Send;
fn withdraw_funds(
&self,
request: &WithdrawRequest,
) -> impl Future<Output = Result<ConfirmationRefId, KrakenError>> + Send;
fn get_withdraw_status(
&self,
request: Option<&WithdrawStatusRequest>,
) -> impl Future<Output = Result<DepositWithdrawStatusResponse, KrakenError>> + Send;
fn withdraw_cancel(
&self,
request: &WithdrawCancelRequest,
) -> impl Future<Output = Result<bool, KrakenError>> + Send;
fn wallet_transfer(
&self,
request: &WalletTransferRequest,
) -> impl Future<Output = Result<ConfirmationRefId, KrakenError>> + Send;
fn earn_allocate(
&self,
request: &EarnAllocateRequest,
) -> impl Future<Output = Result<bool, KrakenError>> + Send;
fn earn_deallocate(
&self,
request: &EarnAllocateRequest,
) -> impl Future<Output = Result<bool, KrakenError>> + Send;
fn get_earn_allocation_status(
&self,
request: &EarnAllocationStatusRequest,
) -> impl Future<Output = Result<AllocationStatus, KrakenError>> + Send;
fn get_earn_deallocation_status(
&self,
request: &EarnAllocationStatusRequest,
) -> impl Future<Output = Result<AllocationStatus, KrakenError>> + Send;
fn list_earn_strategies(
&self,
request: Option<&EarnStrategiesRequest>,
) -> impl Future<Output = Result<EarnStrategies, KrakenError>> + Send;
fn list_earn_allocations(
&self,
request: Option<&EarnAllocationsRequest>,
) -> impl Future<Output = Result<EarnAllocations, KrakenError>> + Send;
fn add_order(
&self,
request: &AddOrderRequest,
) -> impl Future<Output = Result<AddOrderResponse, KrakenError>> + Send;
fn cancel_order(
&self,
request: &CancelOrderRequest,
) -> impl Future<Output = Result<CancelOrderResponse, KrakenError>> + Send;
fn cancel_all_orders(
&self,
) -> impl Future<Output = Result<CancelOrderResponse, KrakenError>> + Send;
fn get_websocket_token(
&self,
) -> impl Future<Output = Result<WebSocketToken, KrakenError>> + Send;
}
#[allow(async_fn_in_trait)]
pub trait KrakenClientExt: Send + Sync {
async fn get_server_time(&self) -> Result<ServerTime, KrakenError>;
async fn get_system_status(&self) -> Result<SystemStatus, KrakenError>;
async fn get_assets(
&self,
request: Option<&AssetInfoRequest>,
) -> Result<HashMap<String, AssetInfo>, KrakenError>;
async fn get_asset_pairs(
&self,
request: Option<&AssetPairsRequest>,
) -> Result<HashMap<String, AssetPair>, KrakenError>;
async fn get_ticker(&self, pairs: &str) -> Result<HashMap<String, TickerInfo>, KrakenError>;
async fn get_ohlc(&self, request: &OhlcRequest) -> Result<OhlcResponse, KrakenError>;
async fn get_order_book(
&self,
request: &OrderBookRequest,
) -> Result<HashMap<String, OrderBook>, KrakenError>;
async fn get_recent_trades(
&self,
request: &RecentTradesRequest,
) -> Result<RecentTradesResponse, KrakenError>;
async fn get_recent_spreads(
&self,
request: &RecentSpreadsRequest,
) -> Result<RecentSpreadsResponse, KrakenError>;
async fn get_account_balance(&self) -> Result<HashMap<String, Decimal>, KrakenError>;
async fn get_extended_balance(&self) -> Result<ExtendedBalances, KrakenError>;
async fn get_trade_balance(
&self,
request: Option<&TradeBalanceRequest>,
) -> Result<TradeBalance, KrakenError>;
async fn get_open_orders(
&self,
request: Option<&OpenOrdersRequest>,
) -> Result<OpenOrders, KrakenError>;
async fn get_closed_orders(
&self,
request: Option<&ClosedOrdersRequest>,
) -> Result<ClosedOrders, KrakenError>;
async fn query_orders(
&self,
request: &QueryOrdersRequest,
) -> Result<HashMap<String, Order>, KrakenError>;
async fn get_trades_history(
&self,
request: Option<&TradesHistoryRequest>,
) -> Result<TradesHistory, KrakenError>;
async fn get_open_positions(
&self,
request: Option<&OpenPositionsRequest>,
) -> Result<HashMap<String, Position>, KrakenError>;
async fn get_ledgers(
&self,
request: Option<&LedgersRequest>,
) -> Result<LedgersInfo, KrakenError>;
async fn get_trade_volume(
&self,
request: Option<&TradeVolumeRequest>,
) -> Result<TradeVolume, KrakenError>;
async fn get_deposit_methods(
&self,
request: &DepositMethodsRequest,
) -> Result<Vec<DepositMethod>, KrakenError>;
async fn get_deposit_addresses(
&self,
request: &DepositAddressesRequest,
) -> Result<Vec<DepositAddress>, KrakenError>;
async fn get_deposit_status(
&self,
request: Option<&DepositStatusRequest>,
) -> Result<DepositWithdrawStatusResponse, KrakenError>;
async fn get_withdraw_methods(
&self,
request: Option<&WithdrawMethodsRequest>,
) -> Result<Vec<WithdrawMethod>, KrakenError>;
async fn get_withdraw_addresses(
&self,
request: Option<&WithdrawAddressesRequest>,
) -> Result<Vec<WithdrawalAddress>, KrakenError>;
async fn get_withdraw_info(
&self,
request: &WithdrawInfoRequest,
) -> Result<WithdrawInfo, KrakenError>;
async fn withdraw_funds(
&self,
request: &WithdrawRequest,
) -> Result<ConfirmationRefId, KrakenError>;
async fn get_withdraw_status(
&self,
request: Option<&WithdrawStatusRequest>,
) -> Result<DepositWithdrawStatusResponse, KrakenError>;
async fn withdraw_cancel(&self, request: &WithdrawCancelRequest) -> Result<bool, KrakenError>;
async fn wallet_transfer(
&self,
request: &WalletTransferRequest,
) -> Result<ConfirmationRefId, KrakenError>;
async fn earn_allocate(&self, request: &EarnAllocateRequest) -> Result<bool, KrakenError>;
async fn earn_deallocate(&self, request: &EarnAllocateRequest) -> Result<bool, KrakenError>;
async fn get_earn_allocation_status(
&self,
request: &EarnAllocationStatusRequest,
) -> Result<AllocationStatus, KrakenError>;
async fn get_earn_deallocation_status(
&self,
request: &EarnAllocationStatusRequest,
) -> Result<AllocationStatus, KrakenError>;
async fn list_earn_strategies(
&self,
request: Option<&EarnStrategiesRequest>,
) -> Result<EarnStrategies, KrakenError>;
async fn list_earn_allocations(
&self,
request: Option<&EarnAllocationsRequest>,
) -> Result<EarnAllocations, KrakenError>;
async fn add_order(&self, request: &AddOrderRequest) -> Result<AddOrderResponse, KrakenError>;
async fn cancel_order(
&self,
request: &CancelOrderRequest,
) -> Result<CancelOrderResponse, KrakenError>;
async fn cancel_all_orders(&self) -> Result<CancelOrderResponse, KrakenError>;
async fn get_websocket_token(&self) -> Result<WebSocketToken, KrakenError>;
}
impl<T: KrakenClient> KrakenClientExt for T {
async fn get_server_time(&self) -> Result<ServerTime, KrakenError> {
KrakenClient::get_server_time(self).await
}
async fn get_system_status(&self) -> Result<SystemStatus, KrakenError> {
KrakenClient::get_system_status(self).await
}
async fn get_assets(
&self,
request: Option<&AssetInfoRequest>,
) -> Result<HashMap<String, AssetInfo>, KrakenError> {
KrakenClient::get_assets(self, request).await
}
async fn get_asset_pairs(
&self,
request: Option<&AssetPairsRequest>,
) -> Result<HashMap<String, AssetPair>, KrakenError> {
KrakenClient::get_asset_pairs(self, request).await
}
async fn get_ticker(&self, pairs: &str) -> Result<HashMap<String, TickerInfo>, KrakenError> {
KrakenClient::get_ticker(self, pairs).await
}
async fn get_ohlc(&self, request: &OhlcRequest) -> Result<OhlcResponse, KrakenError> {
KrakenClient::get_ohlc(self, request).await
}
async fn get_order_book(
&self,
request: &OrderBookRequest,
) -> Result<HashMap<String, OrderBook>, KrakenError> {
KrakenClient::get_order_book(self, request).await
}
async fn get_recent_trades(
&self,
request: &RecentTradesRequest,
) -> Result<RecentTradesResponse, KrakenError> {
KrakenClient::get_recent_trades(self, request).await
}
async fn get_recent_spreads(
&self,
request: &RecentSpreadsRequest,
) -> Result<RecentSpreadsResponse, KrakenError> {
KrakenClient::get_recent_spreads(self, request).await
}
async fn get_account_balance(&self) -> Result<HashMap<String, Decimal>, KrakenError> {
KrakenClient::get_account_balance(self).await
}
async fn get_extended_balance(&self) -> Result<ExtendedBalances, KrakenError> {
KrakenClient::get_extended_balance(self).await
}
async fn get_trade_balance(
&self,
request: Option<&TradeBalanceRequest>,
) -> Result<TradeBalance, KrakenError> {
KrakenClient::get_trade_balance(self, request).await
}
async fn get_open_orders(
&self,
request: Option<&OpenOrdersRequest>,
) -> Result<OpenOrders, KrakenError> {
KrakenClient::get_open_orders(self, request).await
}
async fn get_closed_orders(
&self,
request: Option<&ClosedOrdersRequest>,
) -> Result<ClosedOrders, KrakenError> {
KrakenClient::get_closed_orders(self, request).await
}
async fn query_orders(
&self,
request: &QueryOrdersRequest,
) -> Result<HashMap<String, Order>, KrakenError> {
KrakenClient::query_orders(self, request).await
}
async fn get_trades_history(
&self,
request: Option<&TradesHistoryRequest>,
) -> Result<TradesHistory, KrakenError> {
KrakenClient::get_trades_history(self, request).await
}
async fn get_open_positions(
&self,
request: Option<&OpenPositionsRequest>,
) -> Result<HashMap<String, Position>, KrakenError> {
KrakenClient::get_open_positions(self, request).await
}
async fn get_ledgers(
&self,
request: Option<&LedgersRequest>,
) -> Result<LedgersInfo, KrakenError> {
KrakenClient::get_ledgers(self, request).await
}
async fn get_trade_volume(
&self,
request: Option<&TradeVolumeRequest>,
) -> Result<TradeVolume, KrakenError> {
KrakenClient::get_trade_volume(self, request).await
}
async fn get_deposit_methods(
&self,
request: &DepositMethodsRequest,
) -> Result<Vec<DepositMethod>, KrakenError> {
KrakenClient::get_deposit_methods(self, request).await
}
async fn get_deposit_addresses(
&self,
request: &DepositAddressesRequest,
) -> Result<Vec<DepositAddress>, KrakenError> {
KrakenClient::get_deposit_addresses(self, request).await
}
async fn get_deposit_status(
&self,
request: Option<&DepositStatusRequest>,
) -> Result<DepositWithdrawStatusResponse, KrakenError> {
KrakenClient::get_deposit_status(self, request).await
}
async fn get_withdraw_methods(
&self,
request: Option<&WithdrawMethodsRequest>,
) -> Result<Vec<WithdrawMethod>, KrakenError> {
KrakenClient::get_withdraw_methods(self, request).await
}
async fn get_withdraw_addresses(
&self,
request: Option<&WithdrawAddressesRequest>,
) -> Result<Vec<WithdrawalAddress>, KrakenError> {
KrakenClient::get_withdraw_addresses(self, request).await
}
async fn get_withdraw_info(
&self,
request: &WithdrawInfoRequest,
) -> Result<WithdrawInfo, KrakenError> {
KrakenClient::get_withdraw_info(self, request).await
}
async fn withdraw_funds(
&self,
request: &WithdrawRequest,
) -> Result<ConfirmationRefId, KrakenError> {
KrakenClient::withdraw_funds(self, request).await
}
async fn get_withdraw_status(
&self,
request: Option<&WithdrawStatusRequest>,
) -> Result<DepositWithdrawStatusResponse, KrakenError> {
KrakenClient::get_withdraw_status(self, request).await
}
async fn withdraw_cancel(&self, request: &WithdrawCancelRequest) -> Result<bool, KrakenError> {
KrakenClient::withdraw_cancel(self, request).await
}
async fn wallet_transfer(
&self,
request: &WalletTransferRequest,
) -> Result<ConfirmationRefId, KrakenError> {
KrakenClient::wallet_transfer(self, request).await
}
async fn earn_allocate(&self, request: &EarnAllocateRequest) -> Result<bool, KrakenError> {
KrakenClient::earn_allocate(self, request).await
}
async fn earn_deallocate(&self, request: &EarnAllocateRequest) -> Result<bool, KrakenError> {
KrakenClient::earn_deallocate(self, request).await
}
async fn get_earn_allocation_status(
&self,
request: &EarnAllocationStatusRequest,
) -> Result<AllocationStatus, KrakenError> {
KrakenClient::get_earn_allocation_status(self, request).await
}
async fn get_earn_deallocation_status(
&self,
request: &EarnAllocationStatusRequest,
) -> Result<AllocationStatus, KrakenError> {
KrakenClient::get_earn_deallocation_status(self, request).await
}
async fn list_earn_strategies(
&self,
request: Option<&EarnStrategiesRequest>,
) -> Result<EarnStrategies, KrakenError> {
KrakenClient::list_earn_strategies(self, request).await
}
async fn list_earn_allocations(
&self,
request: Option<&EarnAllocationsRequest>,
) -> Result<EarnAllocations, KrakenError> {
KrakenClient::list_earn_allocations(self, request).await
}
async fn add_order(&self, request: &AddOrderRequest) -> Result<AddOrderResponse, KrakenError> {
KrakenClient::add_order(self, request).await
}
async fn cancel_order(
&self,
request: &CancelOrderRequest,
) -> Result<CancelOrderResponse, KrakenError> {
KrakenClient::cancel_order(self, request).await
}
async fn cancel_all_orders(&self) -> Result<CancelOrderResponse, KrakenError> {
KrakenClient::cancel_all_orders(self).await
}
async fn get_websocket_token(&self) -> Result<WebSocketToken, KrakenError> {
KrakenClient::get_websocket_token(self).await
}
}