finance_query/models/market_summary/
response.rs

1//! Market Summary Response Model
2//!
3//! Represents market summary quotes from Yahoo Finance
4
5use crate::models::quote::FormattedValue;
6use serde::{Deserialize, Serialize};
7
8/// A single market summary quote (index, currency, commodity, etc.)
9#[derive(Debug, Clone, Serialize, Deserialize)]
10#[cfg_attr(feature = "dataframe", derive(crate::ToDataFrame))]
11#[serde(rename_all = "camelCase")]
12#[non_exhaustive]
13pub struct MarketSummaryQuote {
14    /// Stock symbol
15    pub symbol: String,
16    /// Full market name
17    pub full_exchange_name: Option<String>,
18    /// Exchange code
19    pub exchange: Option<String>,
20    /// Short name
21    pub short_name: Option<String>,
22    /// Quote type (INDEX, CURRENCY, FUTURE, etc.)
23    pub quote_type: Option<String>,
24    /// Market state (REGULAR, PRE, POST, CLOSED)
25    pub market_state: Option<String>,
26    /// Regular market price
27    #[serde(default)]
28    pub regular_market_price: Option<FormattedValue<f64>>,
29    /// Regular market change
30    #[serde(default)]
31    pub regular_market_change: Option<FormattedValue<f64>>,
32    /// Regular market change percent
33    #[serde(default)]
34    pub regular_market_change_percent: Option<FormattedValue<f64>>,
35    /// Regular market previous close
36    #[serde(default)]
37    pub regular_market_previous_close: Option<FormattedValue<f64>>,
38    /// Regular market time (Unix timestamp)
39    #[serde(default)]
40    pub regular_market_time: Option<FormattedValue<i64>>,
41    /// Spark chart data (if available)
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub spark: Option<SparkData>,
44}
45
46/// Spark chart mini-data for market summary
47#[derive(Debug, Clone, Serialize, Deserialize)]
48#[serde(rename_all = "camelCase")]
49pub struct SparkData {
50    /// Close prices
51    #[serde(default)]
52    pub close: Option<Vec<Option<f64>>>,
53    /// Timestamps
54    #[serde(default)]
55    pub timestamp: Option<Vec<i64>>,
56    /// Symbol
57    #[serde(default)]
58    pub symbol: Option<String>,
59    /// Previous close
60    #[serde(default)]
61    pub previous_close: Option<f64>,
62    /// Chart previous close
63    #[serde(default)]
64    pub chart_previous_close: Option<f64>,
65}
66
67/// Raw response from market summary endpoint
68#[derive(Debug, Clone, Deserialize)]
69#[serde(rename_all = "camelCase")]
70pub(crate) struct RawMarketSummaryResponse {
71    pub market_summary_response: Option<MarketSummaryResult>,
72}
73
74#[derive(Debug, Clone, Deserialize)]
75#[serde(rename_all = "camelCase")]
76#[allow(dead_code)]
77pub(crate) struct MarketSummaryResult {
78    pub result: Option<Vec<MarketSummaryQuote>>,
79    pub error: Option<serde_json::Value>,
80}
81
82impl MarketSummaryQuote {
83    /// Parse market summary quotes from the raw JSON response
84    pub(crate) fn from_response(value: serde_json::Value) -> Result<Vec<Self>, serde_json::Error> {
85        let raw: RawMarketSummaryResponse = serde_json::from_value(value)?;
86        Ok(raw
87            .market_summary_response
88            .and_then(|r| r.result)
89            .unwrap_or_default())
90    }
91}