use reqwest::Url;
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use serde_with::{NoneAsEmptyString, serde_as};
use uuid::Uuid;
#[derive(Debug, Clone)]
pub enum HoldingsSelector {
All,
AccountId(Uuid),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Account {
pub account_id: Uuid,
pub account_number: String,
pub account_name: String,
pub currency: String,
pub summary: AccountSummary,
pub positions: Vec<Position>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountSummary {
pub total_market_value: Decimal,
pub available_for_purchase: Decimal,
pub total_value: Decimal,
pub currency: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Position {
pub instrument_name: String,
pub ticker: String,
pub orderbook_id: u64,
pub possible_orderbook_ids: Vec<u64>,
pub quantity: Decimal,
pub market_value: InstrumentValue,
pub unrealized_result: InstrumentValue,
pub unrealized_result_percent: Decimal,
pub instrument_currency: String,
pub fx_rate: Decimal,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InstrumentValue {
pub account_currency: Decimal,
pub instrument_currency: Decimal,
}
#[serde_as]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountInfo {
pub account_id: Uuid,
pub account_number: String,
#[serde_as(as = "NoneAsEmptyString")]
pub account_name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TradeTicketArgs {
pub side: TradeSide,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub account_id: Option<Uuid>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub price: Option<Decimal>,
#[serde(flatten)]
pub volume: TradeVolume,
pub currency: Option<String>,
#[serde(flatten)]
pub instrument: TradeInstrument,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum TradeVolume {
#[serde(rename = "amount")]
Amount(Decimal),
Quantity(Decimal),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum TradeInstrument {
Name(String),
OrderbookId(u64),
Ticker(String),
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub enum TradeSide {
#[default]
Buy,
Sell,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct CreateTradeTicketResult {
pub url: Url,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TradeInstrumentInfo {
pub name: String,
pub orderbook_id: u64,
pub ticker: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WatchlistInfo {
pub list_id: u64,
pub name: String,
pub orderbook_count: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Watchlist {
pub list_id: u64,
pub name: String,
pub items: Vec<TradeInstrumentInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RemoveFromWatchlistResult {
pub list_id: u64,
pub orderbook_ids: Vec<u64>,
}