use crate::models::quote::FormattedValue;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "dataframe", derive(crate::ToDataFrame))]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct MarketSummaryQuote {
pub symbol: String,
pub full_exchange_name: Option<String>,
pub exchange: Option<String>,
pub short_name: Option<String>,
pub quote_type: Option<String>,
pub market_state: Option<String>,
#[serde(default)]
pub regular_market_price: Option<FormattedValue<f64>>,
#[serde(default)]
pub regular_market_change: Option<FormattedValue<f64>>,
#[serde(default)]
pub regular_market_change_percent: Option<FormattedValue<f64>>,
#[serde(default)]
pub regular_market_previous_close: Option<FormattedValue<f64>>,
#[serde(default)]
pub regular_market_time: Option<FormattedValue<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub spark: Option<SparkData>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SparkData {
#[serde(default)]
pub close: Option<Vec<Option<f64>>>,
#[serde(default)]
pub timestamp: Option<Vec<i64>>,
#[serde(default)]
pub symbol: Option<String>,
#[serde(default)]
pub previous_close: Option<f64>,
#[serde(default)]
pub chart_previous_close: Option<f64>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct RawMarketSummaryResponse {
pub market_summary_response: Option<MarketSummaryResult>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct MarketSummaryResult {
pub result: Option<Vec<MarketSummaryQuote>>,
}
impl MarketSummaryQuote {
pub(crate) fn from_response(value: serde_json::Value) -> Result<Vec<Self>, serde_json::Error> {
let raw: RawMarketSummaryResponse = serde_json::from_value(value)?;
Ok(raw
.market_summary_response
.and_then(|r| r.result)
.unwrap_or_default())
}
}