use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Earnings {
pub symbol: Option<String>,
pub instrument: Option<String>,
pub year: Option<i32>,
pub quarter: Option<i32>,
pub eps: Option<EarningsEps>,
pub report: Option<EarningsReport>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EarningsEps {
pub estimate: Option<String>,
pub actual: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EarningsReport {
pub date: Option<String>,
pub timing: Option<String>,
pub verified: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Rating {
pub instrument_id: Option<String>,
pub summary: Option<RatingSummary>,
pub ratings: Option<Vec<RatingEntry>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RatingSummary {
pub num_buy_ratings: Option<i32>,
pub num_hold_ratings: Option<i32>,
pub num_sell_ratings: Option<i32>,
}
impl RatingSummary {
#[expect(
clippy::arithmetic_side_effects,
reason = "the analyst-rating counts from the upstream API response are assumed to sum within i32; no in-code bound enforces this"
)]
pub fn total(&self) -> i32 {
self.num_buy_ratings.unwrap_or(0)
+ self.num_hold_ratings.unwrap_or(0)
+ self.num_sell_ratings.unwrap_or(0)
}
pub fn buy_pct(&self) -> f64 {
let total = self.total();
if total == 0 {
return 0.0;
}
f64::from(self.num_buy_ratings.unwrap_or(0)) / f64::from(total) * 100.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RatingEntry {
pub published_by: Option<String>,
#[serde(rename = "type")]
pub rating_type: Option<String>,
pub text: Option<String>,
pub published_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NewsArticle {
pub uuid: Option<String>,
pub title: Option<String>,
pub source: Option<String>,
pub url: Option<String>,
pub summary: Option<String>,
pub published_at: Option<String>,
pub related_instruments: Option<Vec<String>>,
pub preview_image_url: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct StockSplit {
pub url: Option<String>,
pub instrument: Option<String>,
pub execution_date: Option<String>,
pub multiplier: Option<String>,
pub divisor: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TagResult {
pub name: Option<String>,
pub slug: Option<String>,
pub instruments: Option<Vec<String>>,
}