use serde::{Deserialize, Deserializer, Serialize};
use crate::{
codecs::NumericString,
types::{Cik, CountryCode, CurrencyCode, Date, ExchangeCode, Industry, Sector, Ticker},
};
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 CompanySymbol {
pub symbol: Ticker,
pub company_name: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct FinancialStatementSymbol {
pub symbol: Ticker,
pub company_name: String,
pub trading_currency: CurrencyCode,
#[serde(deserialize_with = "crate::codecs::empty_or_null::deserialize")]
pub reporting_currency: Option<CurrencyCode>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct CikListing {
pub cik: Cik,
pub company_name: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct SymbolChange {
pub date: Date,
pub company_name: String,
pub old_symbol: Ticker,
pub new_symbol: Ticker,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct EtfSymbol {
pub symbol: Ticker,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct ActivelyTradingSymbol {
pub symbol: Ticker,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct EarningsTranscriptAvailability {
pub symbol: Ticker,
pub company_name: String,
pub no_of_transcripts: NumericString,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct AvailableExchange {
pub exchange: ExchangeCode,
pub name: String,
pub country_name: String,
#[serde(deserialize_with = "crate::codecs::empty_or_null::deserialize")]
pub country_code: Option<CountryCode>,
pub symbol_suffix: String,
#[serde(deserialize_with = "required_option")]
pub delay: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct AvailableSector {
pub sector: Sector,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct AvailableIndustry {
pub industry: Industry,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct AvailableCountry {
pub country: CountryCode,
}