Skip to main content

finance_query/models/corporate/
recommendation_trend.rs

1//! Recommendation Trend Module
2//!
3//! Contains analyst recommendation trends over time.
4
5use serde::{Deserialize, Serialize};
6
7/// Analyst recommendation trends
8#[derive(Default, Debug, Clone, Serialize, Deserialize)]
9#[serde(rename_all = "camelCase")]
10#[non_exhaustive]
11pub struct RecommendationTrend {
12    /// List of recommendation trends by period
13    #[serde(default)]
14    pub trend: Vec<RecommendationPeriod>,
15
16    /// Maximum age of this data in seconds
17    #[serde(default)]
18    pub max_age: Option<i64>,
19}
20
21/// Recommendations for a specific time period
22#[derive(Debug, Clone, Serialize, Deserialize)]
23#[serde(rename_all = "camelCase")]
24pub struct RecommendationPeriod {
25    /// Time period (e.g., "0m", "-1m", "-2m")
26    #[serde(default)]
27    pub period: Option<String>,
28
29    /// Number of strong buy recommendations
30    #[serde(default)]
31    pub strong_buy: Option<i32>,
32
33    /// Number of buy recommendations
34    #[serde(default)]
35    pub buy: Option<i32>,
36
37    /// Number of hold recommendations
38    #[serde(default)]
39    pub hold: Option<i32>,
40
41    /// Number of sell recommendations
42    #[serde(default)]
43    pub sell: Option<i32>,
44
45    /// Number of strong sell recommendations
46    #[serde(default)]
47    pub strong_sell: Option<i32>,
48}
49
50impl RecommendationPeriod {
51    /// Calculate total number of analyst recommendations
52    pub fn total(&self) -> i32 {
53        self.strong_buy.unwrap_or(0)
54            + self.buy.unwrap_or(0)
55            + self.hold.unwrap_or(0)
56            + self.sell.unwrap_or(0)
57            + self.strong_sell.unwrap_or(0)
58    }
59
60    /// Calculate average recommendation score (1.0 = strong buy, 5.0 = strong sell)
61    pub fn average_score(&self) -> Option<f64> {
62        let total = self.total();
63        if total == 0 {
64            return None;
65        }
66
67        let score = (self.strong_buy.unwrap_or(0) as f64 * 1.0)
68            + (self.buy.unwrap_or(0) as f64 * 2.0)
69            + (self.hold.unwrap_or(0) as f64 * 3.0)
70            + (self.sell.unwrap_or(0) as f64 * 4.0)
71            + (self.strong_sell.unwrap_or(0) as f64 * 5.0);
72
73        Some(score / total as f64)
74    }
75}