use super::{ExecutionVenue, Product};
use anyhow::{bail, Result};
use chrono::{DateTime, NaiveDate, Utc};
use rust_decimal::Decimal;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema)]
#[cfg_attr(feature = "graphql", derive(juniper::GraphQLObject))]
pub struct ProductCatalogInfo {
pub last_updated: Option<DateTime<Utc>>,
pub as_of_date: Option<NaiveDate>,
pub exchange: ExecutionVenue,
pub exchange_product: String,
pub quote_currency: Option<Product>,
pub multiplier: Option<Decimal>,
pub category: Option<String>,
pub sub_category: Option<String>,
pub short_description: Option<String>,
pub long_description: Option<String>,
pub schedule_description: Option<String>,
pub settle_method: Option<String>,
pub price_display_format: Option<String>,
pub market_cap: Option<Decimal>,
pub price_to_earnings: Option<Decimal>,
pub eps_adj: Option<Decimal>,
pub shared_outstanding_weighted_adj: Option<Decimal>,
pub dividend: Option<Decimal>,
pub dividend_yield: Option<Decimal>,
pub info_url: Option<String>,
pub cqg_contract_symbol: Option<String>,
}
impl ProductCatalogInfo {
pub fn product_root(&self) -> Result<&str> {
match self.exchange_product.split_once(' ') {
Some((root, _)) => Ok(root),
None => bail!("no root for symbol: {}", self.exchange_product),
}
}
pub fn sector(&self) -> Option<&str> {
self.category.as_deref()
}
}