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}