use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RecommendationTrend {
#[serde(default)]
pub trend: Vec<RecommendationPeriod>,
#[serde(default)]
pub max_age: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RecommendationPeriod {
#[serde(default)]
pub period: Option<String>,
#[serde(default)]
pub strong_buy: Option<i32>,
#[serde(default)]
pub buy: Option<i32>,
#[serde(default)]
pub hold: Option<i32>,
#[serde(default)]
pub sell: Option<i32>,
#[serde(default)]
pub strong_sell: Option<i32>,
}
impl RecommendationPeriod {
pub fn total(&self) -> i32 {
self.strong_buy.unwrap_or(0)
+ self.buy.unwrap_or(0)
+ self.hold.unwrap_or(0)
+ self.sell.unwrap_or(0)
+ self.strong_sell.unwrap_or(0)
}
pub fn average_score(&self) -> Option<f64> {
let total = self.total();
if total == 0 {
return None;
}
let score = (self.strong_buy.unwrap_or(0) as f64 * 1.0)
+ (self.buy.unwrap_or(0) as f64 * 2.0)
+ (self.hold.unwrap_or(0) as f64 * 3.0)
+ (self.sell.unwrap_or(0) as f64 * 4.0)
+ (self.strong_sell.unwrap_or(0) as f64 * 5.0);
Some(score / total as f64)
}
}