deribit 0.3.3

Rust client for deribit. Please look at tests/examples for detailed usages.
Documentation
use crate::models::{AssetKind, Currency, Direction};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

crate::define_request! {
    Name => GetPositions;
    Method => "private/get_positions";
    Request => {
        pub currency: Currency,
        #[serde(skip_serializing_if = "Option::is_none")]
        pub kind: Option<AssetKind>,
    };
    Response => Vec<GetPositionsResponse>;
}

impl GetPositionsRequest {
    pub fn all(currency: Currency) -> Self {
        Self {
            currency,
            kind: None,
        }
    }

    pub fn futures(currency: Currency) -> Self {
        Self {
            currency,
            kind: Some(AssetKind::Future),
        }
    }

    pub fn options(currency: Currency) -> Self {
        Self {
            currency,
            kind: Some(AssetKind::Option),
        }
    }
}

#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct GetPositionsResponse {
    pub average_price: f64,
    pub average_price_usd: Option<f64>,
    pub delta: f64,
    pub direction: Direction,
    pub estimated_liquidation_price: Option<f64>,
    pub floating_profit_loss: f64,
    pub floating_profit_loss_usd: Option<f64>,
    pub index_price: f64,
    pub initial_margin: f64,
    pub instrument_name: String,
    pub kind: AssetKind,
    pub maintenance_margin: f64,
    pub mark_price: f64,
    pub open_orders_margin: f64,
    pub realized_profit_loss: f64,
    pub settlement_price: f64,
    pub size: f64,
    pub size_currency: Option<f64>,
    pub total_profit_loss: f64,
}

crate::define_request! {
    Name => GetAccountSummary;
    Method => "private/get_account_summary";
    Request => {
        pub currency: Currency,
        pub extended: bool,
    };
    Response => {
        pub options_gamma: f64,
        pub projected_maintenance_margin: Option<f64>,
        pub system_name: Option<String>,
        pub margin_balance: f64,
        pub tfa_enabled: Option<bool>,
        pub username: Option<String>,
        pub equity: f64,
        pub futures_pl: f64,
        pub options_session_upl: f64,
        pub id: Option<u64>,
        pub options_vega: f64,
        pub session_funding: Option<f64>,
        pub currency: Currency,
        pub r#type: Option<String>,
        pub futures_session_rpl: f64,
        pub options_theta: f64,
        pub portfolio_margin_enabled: Option<bool>,
        pub session_rpl: f64,
        pub delta_total: f64,
        pub options_pl: f64,
        pub available_withdrawal_funds: f64,
        pub maintenance_margin: f64,
        pub initial_margin: f64,
        pub futures_session_upl: f64,
        pub options_session_rpl: f64,
        pub available_funds: f64,
        pub email: Option<String>,
        pub session_upl: f64,
        pub total_pl: f64,
        pub options_delta: f64,
        pub balance: f64,
        pub projected_initial_margin: Option<f64>,
        pub deposit_address: Option<String>,
        pub referrer_id: Option<String>,
    };
}

impl GetAccountSummaryRequest {
    pub fn abridged(currency: Currency) -> Self {
        Self {
            currency,
            ..Default::default()
        }
    }
    pub fn extended(currency: Currency) -> Self {
        Self {
            currency,
            extended: true,
        }
    }
}

crate::define_request! {
    Name => GetSubaccounts;
    Method => "private/get_subaccounts";
    Request => {
        pub with_portfolio: bool,
    };
    Response => Vec<GetSubaccountsResponse>;
}

impl GetSubaccountsRequest {
    pub fn new() -> Self {
        Self {
            with_portfolio: false,
        }
    }

    pub fn with_portfolio() -> Self {
        Self {
            with_portfolio: true,
        }
    }
}

#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct Portfolio {
    pub available_funds: f64,
    pub available_withdrawal_funds: f64,
    pub balance: f64,
    pub currency: Currency,
    pub equity: f64,
    pub initial_margin: f64,
    pub maintenance_margin: f64,
    pub margin_balance: f64,
}

#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct GetSubaccountsResponse {
    pub email: String,
    pub id: u64,
    pub is_password: bool,
    pub login_enabled: bool,
    pub not_confirmed_email: Option<String>,
    pub portfolio: HashMap<Currency, Portfolio>,
    pub receive_notifications: bool,
    pub system_name: String,
    pub tfa_enabled: Option<bool>,
    pub r#type: String,
    pub username: String,
    pub referrals_count: u64,
    pub security_keys_enabled: bool,
}