birdie 0.1.0

Birdie is a third party Binance API client, allowing you to easily interact with the Binance API using Rust.
Documentation
mod close_user_data_stream;
mod keepalive_user_data_stream;
mod start_user_data_stream;

pub use close_user_data_stream::*;
pub use keepalive_user_data_stream::*;
pub use start_user_data_stream::*;

use crate::{
    enums::{
        ContingencyType, OrderListOrderStatus, OrderListStatus, OrderSide, OrderType,
        SelfTradePreventionMode, TimeInForce, WorkingFloor,
    },
    rest_api::{route, RestApiClient},
    web_socket_stream::Payload,
};
use serde::Deserialize;

pub struct RestApiHandler<'r> {
    client: &'r RestApiClient,
}

impl<'r> RestApiHandler<'r> {
    pub fn new(client: &'r RestApiClient) -> Self {
        RestApiHandler { client }
    }

    route!(start_user_data_stream, StartUserDataStreamEndpoint);
    route!(keepalive_user_data_stream, KeepaliveUserDataStreamEndpoint);
    route!(close_user_data_stream, CloseUserDataStreamEndpoint);
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
#[serde(tag = "e")]
pub enum UserDataStreamPayload {
    OutboundAccountPosition(OutboundAccountPosition),
    BalanceUpdate(BalanceUpdate),
    ExecutionReport(ExecutionReport),
    ListStatus(ListStatus),
    ListenKeyExpired(ListenKeyExpired),
}

impl Payload for UserDataStreamPayload {}

#[derive(Clone, Debug, Deserialize)]
pub struct OutboundAccountPosition {
    #[serde(rename = "E")]
    pub event_time: i64,
    #[serde(rename = "u")]
    pub last_account_update: i64,
    #[serde(rename = "B")]
    pub balances: Vec<BalanceData>,
}

#[derive(Clone, Debug, Deserialize)]
pub struct BalanceData {
    #[serde(rename = "a")]
    pub asset: String,
    #[serde(rename = "f")]
    pub free: String,
    #[serde(rename = "l")]
    pub locked: String,
}

#[derive(Clone, Debug, Deserialize)]
pub struct BalanceUpdate {
    #[serde(rename = "E")]
    pub event_time: i64,
    #[serde(rename = "a")]
    pub asset: String,
    #[serde(rename = "d")]
    pub balance_delta: String,
    #[serde(rename = "T")]
    pub clear_time: i64,
}

#[derive(Clone, Debug, Deserialize)]
pub struct ExecutionReport {
    #[serde(rename = "E")]
    pub event_time: i64,
    #[serde(rename = "s")]
    pub symbol: String,
    #[serde(rename = "c")]
    pub client_order_id: String,
    #[serde(rename = "S")]
    pub side: OrderSide,
    #[serde(rename = "o")]
    pub r#type: OrderType,
    #[serde(rename = "f")]
    pub time_in_force: TimeInForce,
    #[serde(rename = "q")]
    pub quantity: String,
    #[serde(rename = "p")]
    pub price: String,
    #[serde(rename = "P")]
    pub stop_price: String,
    #[serde(rename = "F")]
    pub iceberg_quantity: String,
    #[serde(rename = "g")]
    pub order_list_id: i64,
    #[serde(rename = "C")]
    pub orig_client_order_id: String,
    #[serde(rename = "x")]
    pub execution_type: String,
    #[serde(rename = "X")]
    pub order_status: String,
    #[serde(rename = "r")]
    pub reject_reason: String,
    #[serde(rename = "i")]
    pub order_id: i64,
    #[serde(rename = "l")]
    pub last_executed_quantity: String,
    #[serde(rename = "z")]
    pub cummulative_filled_quantity: String,
    #[serde(rename = "L")]
    pub last_executed_price: String,
    #[serde(rename = "n")]
    pub commission_amount: String,
    #[serde(rename = "T")]
    pub transaction_time: i64,
    #[serde(rename = "t")]
    pub trade_id: i64,
    #[serde(rename = "I")]
    pub ignore1: i64,
    #[serde(rename = "w")]
    pub is_on_order_book: bool,
    #[serde(rename = "m")]
    pub is_maker_side: bool,
    #[serde(rename = "M")]
    pub ignore2: bool,
    #[serde(rename = "O")]
    pub order_creation_time: i64,
    #[serde(rename = "Z")]
    pub cumulative_quote_asset_quantity: String,
    #[serde(rename = "Y")]
    pub last_quote_asset_quantity: String,
    #[serde(rename = "Q")]
    pub quote_order_quantity: String,
    #[serde(rename = "V")]
    pub self_trade_prevention_mode: SelfTradePreventionMode,
    #[serde(flatten)]
    pub conditional: ConditionalData,
}

#[derive(Clone, Debug, Deserialize)]
pub struct ConditionalData {
    #[serde(rename = "N")]
    pub commission_asset: Option<String>,
    #[serde(rename = "d")]
    pub trailing_delta: Option<i64>,
    #[serde(rename = "d")]
    pub trailing_time: Option<i64>,
    #[serde(rename = "j")]
    pub strategy_id: Option<i64>,
    #[serde(rename = "J")]
    pub strategy_type: Option<i64>,
    #[serde(rename = "v")]
    pub prevented_match_id: Option<i64>,
    #[serde(rename = "A")]
    pub prevented_quantity: Option<String>,
    #[serde(rename = "B")]
    pub last_prevented_quantity: Option<String>,
    #[serde(rename = "u")]
    pub trade_group_id: Option<i64>,
    #[serde(rename = "U")]
    pub counter_order_id: Option<i64>,
    #[serde(rename = "Cs")]
    pub counter_symbol: Option<String>,
    #[serde(rename = "pl")]
    pub prevented_execution_quantity: Option<String>,
    #[serde(rename = "pL")]
    pub prevented_execution_price: Option<String>,
    #[serde(rename = "pY")]
    pub prevented_execution_quote_qty: Option<String>,
    #[serde(rename = "W")]
    pub working_time: Option<i64>,
    #[serde(rename = "b")]
    pub match_type: Option<String>,
    #[serde(rename = "a")]
    pub allocation_id: Option<i64>,
    #[serde(rename = "k")]
    pub working_floor: Option<WorkingFloor>,
    #[serde(rename = "uS")]
    pub used_sor: Option<bool>,
}

#[derive(Clone, Debug, Deserialize)]
pub struct ListStatus {
    #[serde(rename = "E")]
    pub event_time: i64,
    #[serde(rename = "s")]
    pub symbol: String,
    #[serde(rename = "g")]
    pub order_list_id: i64,
    #[serde(rename = "c")]
    pub contingency_type: ContingencyType,
    #[serde(rename = "l")]
    pub list_status_type: OrderListStatus,
    #[serde(rename = "L")]
    pub list_order_status: OrderListOrderStatus,
    #[serde(rename = "r")]
    pub list_reject_reason: String,
    #[serde(rename = "C")]
    pub list_client_order_id: String,
    #[serde(rename = "O")]
    pub transaction_time: i64,
}

#[derive(Clone, Debug, Deserialize)]
pub struct ListStatusObject {
    #[serde(rename = "s")]
    pub symbol: String,
    #[serde(rename = "i")]
    pub order_id: i64,
    #[serde(rename = "c")]
    pub client_order_id: String,
}

#[derive(Clone, Debug, Deserialize)]
pub struct ListenKeyExpired {
    #[serde(rename = "E")]
    pub event_time: i64,
    #[serde(rename = "listenKey")]
    pub listen_key: String,
}