finance_query/models/search/
response.rs

1//! Search Response Model
2//!
3//! Top-level wrapper for symbol search results
4
5use super::{ResearchReports, SearchNewsList, SearchQuotes};
6use serde::{Deserialize, Serialize};
7
8/// Response wrapper for search endpoint
9#[derive(Debug, Clone, Serialize, Deserialize)]
10#[non_exhaustive]
11#[serde(rename_all = "camelCase")]
12pub struct SearchResults {
13    /// Total result count
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub count: Option<i32>,
16    /// Quote/symbol results - use `.quotes.to_dataframe()` for DataFrame conversion
17    #[serde(default)]
18    pub quotes: SearchQuotes,
19    /// News article results - use `.news.to_dataframe()` for DataFrame conversion
20    #[serde(default)]
21    pub news: SearchNewsList,
22    /// Research reports - use `.research_reports.to_dataframe()` for DataFrame conversion
23    #[serde(default)]
24    pub research_reports: ResearchReports,
25    /// Total search execution time (milliseconds)
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub total_time: Option<i64>,
28}
29
30impl SearchResults {
31    /// Parse SearchResults from JSON value
32    ///
33    /// # Example
34    /// ```no_run
35    /// # use finance_query::SearchResults;
36    /// let json = serde_json::json!({
37    ///     "count": 10,
38    ///     "quotes": [],
39    ///     "news": []
40    /// });
41    /// let response = SearchResults::from_json(json)?;
42    /// # Ok::<(), serde_json::Error>(())
43    /// ```
44    pub fn from_json(value: serde_json::Value) -> Result<Self, serde_json::Error> {
45        serde_json::from_value(value)
46    }
47
48    /// Get total result count
49    pub fn result_count(&self) -> i32 {
50        self.count.unwrap_or(0)
51    }
52}