use super::formatted_value::FormattedValue;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SummaryDetail {
#[serde(skip_serializing_if = "Option::is_none")]
pub algorithm: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub all_time_high: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub all_time_low: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ask: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ask_size: Option<FormattedValue<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub average_daily_volume10_day: Option<FormattedValue<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub average_volume: Option<FormattedValue<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub average_volume10days: Option<FormattedValue<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub beta: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bid: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bid_size: Option<FormattedValue<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub circulating_supply: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub coin_market_cap_link: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub day_high: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub day_low: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dividend_rate: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dividend_yield: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ex_dividend_date: Option<FormattedValue<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expire_date: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fifty_day_average: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fifty_two_week_high: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fifty_two_week_low: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub five_year_avg_dividend_yield: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub forward_pe: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub from_currency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_market: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub market_cap: Option<FormattedValue<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_age: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_supply: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nav_price: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub open: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub open_interest: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payout_ratio: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub previous_close: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub price_hint: Option<FormattedValue<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub price_to_sales_trailing12_months: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub qtd_return: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub regular_market_day_high: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub regular_market_day_low: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub regular_market_open: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub regular_market_previous_close: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub regular_market_volume: Option<FormattedValue<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_date: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub strike_price: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub to_currency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub total_assets: Option<FormattedValue<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tradeable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trailing_annual_dividend_rate: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trailing_annual_dividend_yield: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trailing_pe: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub two_hundred_day_average: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub volume: Option<FormattedValue<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub volume24_hr: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub volume_all_currencies: Option<Value>,
#[serde(rename = "yield", skip_serializing_if = "Option::is_none")]
pub yield_value: Option<FormattedValue<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ytd_return: Option<Value>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_deserialize_summary_detail() {
let json = r#"{
"currency": "USD",
"previousClose": {"fmt": "275.00", "raw": 275.0},
"marketCap": {"fmt": "4.09T", "longFmt": "4,090,000,000,000", "raw": 4090000000000},
"beta": {"fmt": "1.11", "raw": 1.109},
"tradeable": true
}"#;
let detail: SummaryDetail = serde_json::from_str(json).unwrap();
assert_eq!(detail.currency.as_deref(), Some("USD"));
assert_eq!(
detail.previous_close.as_ref().map(|v| v.raw),
Some(Some(275.0))
);
assert_eq!(
detail.market_cap.as_ref().map(|v| v.raw),
Some(Some(4090000000000))
);
assert_eq!(detail.tradeable, Some(true));
}
}