use crate::ids::{InstrumentId, MarketId, TickSizeId};
use crate::models::shared::opt_arb_prec;
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct PriceWithDecimals {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub decimals: Option<i32>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub price: Option<Decimal>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct EtpInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub direction: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub first_trading_date: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub market_view: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub nordnet_markets: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub underlying_instrument_id: Option<InstrumentId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub underlying_name: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct KoInfo {
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub financial_level: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub stop_loss: Option<Decimal>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct MarketInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub identifier: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub market_id: Option<MarketId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub market_sub_id: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tick_size_id: Option<TickSizeId>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct PriceKoInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub indicative_high_risk: Option<bool>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub indicative_leverage: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub risk_buffer: Option<Decimal>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct StatusInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tick_timestamp: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trading_status: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub translated_trading_status: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct MainSearchResponseRow {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agency: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agency_description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub avatar_uri: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub close_price: Option<PriceWithDecimals>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub country: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub diff_pct_one_day: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub diff_pct_one_year: Option<String>,
pub display_name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub display_name_highlighted: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub display_symbol: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub entity_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub etp_info: Option<EtpInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exchange_country: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub external_news_id: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub indicator_identifier: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub indicator_source: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrument_group_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrument_id: Option<InstrumentId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrument_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub is_cms: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub is_external: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub joined_at: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ko_info: Option<KoInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub language: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_price: Option<PriceWithDecimals>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_price_title: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub market_data_order_book_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub market_info: Option<MarketInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub news_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub news_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub news_type_description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub nnx_instrument_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub price_ko_info: Option<PriceKoInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub profile_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub published_date_time: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rating: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub spread: Option<PriceWithDecimals>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub spread_pct: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub status_info: Option<StatusInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tick_timestamp: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trading_order_book_id: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub turnover: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub turnover_volume: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub uri: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub username: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub views: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub yield_1y: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct MainSearchResponse {
pub display_group_description: String,
pub display_group_type: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub limit: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub offset: Option<i32>,
pub results: Vec<MainSearchResponseRow>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total: Option<i32>,
}