use serde::{Deserialize, Deserializer, Serialize};
use crate::types::{
Change, Cik, CountryCode, CurrencyCode, Cusip, Date, ExchangeCode, Isin, MarketCapitalization,
PerShareAmount, Price, Ratio, Ticker, Volume,
};
fn required_option<'de, D, T>(deserializer: D) -> Result<Option<T>, D::Error>
where
D: Deserializer<'de>,
T: Deserialize<'de>,
{
Option::<T>::deserialize(deserializer)
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct SymbolSearchResult {
pub symbol: Ticker,
pub name: String,
pub currency: CurrencyCode,
pub exchange_full_name: String,
pub exchange: ExchangeCode,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct NameSearchResult {
pub symbol: Ticker,
pub name: String,
pub currency: CurrencyCode,
pub exchange_full_name: String,
pub exchange: ExchangeCode,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct CikSearchResult {
pub symbol: Ticker,
pub company_name: String,
pub cik: Cik,
pub exchange_full_name: String,
pub exchange: ExchangeCode,
pub currency: CurrencyCode,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct CusipSearchResult {
pub symbol: Ticker,
pub company_name: String,
pub cusip: Cusip,
#[serde(serialize_with = "crate::codecs::integral_f64::serialize")]
pub market_cap: MarketCapitalization,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct IsinSearchResult {
pub symbol: Ticker,
pub name: String,
pub isin: Isin,
#[serde(serialize_with = "crate::codecs::integral_f64::serialize")]
pub market_cap: MarketCapitalization,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct ExchangeVariant {
pub symbol: Ticker,
#[serde(deserialize_with = "required_option")]
pub price: Option<Price>,
#[serde(serialize_with = "crate::codecs::integral_f64::serialize")]
pub beta: Ratio,
#[serde(serialize_with = "crate::codecs::integral_f64::serialize")]
pub vol_avg: Volume,
#[serde(rename = "mktCap")]
#[serde(serialize_with = "crate::codecs::integral_f64::serialize")]
pub market_cap: MarketCapitalization,
#[serde(serialize_with = "crate::codecs::integral_f64::serialize")]
pub last_div: PerShareAmount,
#[serde(deserialize_with = "required_option")]
pub range: Option<String>,
#[serde(deserialize_with = "required_option")]
pub changes: Option<Change>,
pub company_name: String,
pub currency: CurrencyCode,
#[serde(deserialize_with = "required_option")]
pub cik: Option<Cik>,
#[serde(deserialize_with = "required_option")]
pub isin: Option<Isin>,
#[serde(deserialize_with = "crate::codecs::empty_or_null::deserialize")]
pub cusip: Option<Cusip>,
pub exchange: String,
pub exchange_short_name: ExchangeCode,
pub industry: String,
#[serde(deserialize_with = "required_option")]
pub website: Option<String>,
pub description: String,
#[serde(deserialize_with = "required_option")]
pub ceo: Option<String>,
pub sector: String,
pub country: CountryCode,
#[serde(deserialize_with = "required_option")]
pub full_time_employees: Option<String>,
#[serde(deserialize_with = "required_option")]
pub phone: Option<String>,
#[serde(deserialize_with = "required_option")]
pub address: Option<String>,
#[serde(deserialize_with = "required_option")]
pub city: Option<String>,
#[serde(deserialize_with = "required_option")]
pub state: Option<String>,
#[serde(deserialize_with = "required_option")]
pub zip: Option<String>,
#[serde(deserialize_with = "required_option")]
#[serde(serialize_with = "crate::codecs::integral_f64::serialize_option")]
pub dcf_diff: Option<PerShareAmount>,
#[serde(serialize_with = "crate::codecs::integral_f64::serialize")]
pub dcf: PerShareAmount,
pub image: String,
pub ipo_date: Date,
pub default_image: bool,
pub is_etf: bool,
pub is_actively_trading: bool,
pub is_adr: bool,
pub is_fund: bool,
}