use crate::ids::{InstrumentId, IssuerId, MarketId, TickSizeId, TradableId};
use crate::models::shared::{date_iso8601, opt_arb_prec};
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct KeyInformationDocuments {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url_for_combined: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url_for_long: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url_for_short: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct UnderlyingInfo {
pub instrument_id: InstrumentId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrumment_id: Option<InstrumentId>,
pub isin_code: String,
pub symbol: String,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct Tradable {
pub display_order: i64,
pub identifier: TradableId,
#[serde(with = "rust_decimal::serde::arbitrary_precision")]
pub lot_size: Decimal,
pub market_id: MarketId,
pub mic: String,
pub price_unit: String,
pub tick_size_id: TickSizeId,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct Instrument {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub asset_class: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub brochure_url: Option<String>,
pub currency: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dividend_policy: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "date_iso8601::option"
)]
pub expiration_date: Option<time::Date>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrument_group_type: Option<String>,
pub instrument_id: InstrumentId,
pub instrument_type: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub isin_code: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub key_information_documents: Option<KeyInformationDocuments>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub leverage_percentage: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub margin_percentage: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub market_view: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mifid2_category: Option<i32>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub multiplier: Option<Decimal>,
pub name: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub number_of_securities: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub pawn_percentage: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub price_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prospectus_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sector: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sector_group: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sfdr_article: Option<i32>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub strike_price: Option<Decimal>,
pub symbol: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub total_fee: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tradables: Option<Vec<Tradable>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub underlyings: Option<Vec<UnderlyingInfo>>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct InstrumentType {
pub instrument_type: String,
pub name: String,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct InstrumentEligibility {
pub eligible: bool,
pub instrument_id: InstrumentId,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct PublicTrade {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub broker_buying: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub broker_selling: Option<String>,
pub market_id: MarketId,
#[serde(with = "rust_decimal::serde::arbitrary_precision")]
pub price: Decimal,
pub tick_timestamp: i64,
pub trade_id: String,
pub trade_timestamp: i64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trade_type: Option<String>,
pub volume: i64,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct InstrumentPublicTrades {
pub instrument_id: InstrumentId,
pub trades: Vec<PublicTrade>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct Issuer {
pub issuer_id: IssuerId,
pub name: String,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct LeverageFilter {
pub currencies: Vec<String>,
#[serde(with = "date_iso8601::vec")]
pub expiration_dates: Vec<time::Date>,
pub instrument_group_types: Vec<String>,
pub instrument_types: Vec<String>,
pub issuers: Vec<Issuer>,
pub market_view: Vec<String>,
pub no_of_instruments: i64,
}