use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::models::movers::MarketMover;
use crate::models::sectors::MarketSector;
use crate::models::{News, Quote, SimpleQuote};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuotesUpdate {
pub quotes: Vec<SimpleQuote>,
pub timestamp: DateTime<Utc>,
}
impl QuotesUpdate {
pub fn single(quote: SimpleQuote) -> Self {
Self {
quotes: vec![quote],
timestamp: Utc::now(),
}
}
pub fn multiple(quotes: Vec<SimpleQuote>) -> Self {
Self {
quotes,
timestamp: Utc::now(),
}
}
pub fn new(quotes: Vec<SimpleQuote>) -> Self {
Self::multiple(quotes)
}
pub fn with_timestamp(quotes: Vec<SimpleQuote>, timestamp: DateTime<Utc>) -> Self {
Self { quotes, timestamp }
}
pub fn contains_symbol(&self, symbol: &str) -> bool {
self.quotes.iter().any(|q| q.symbol == symbol)
}
pub fn get_quote(&self, symbol: &str) -> Option<&SimpleQuote> {
self.quotes.iter().find(|q| q.symbol == symbol)
}
pub fn is_empty(&self) -> bool {
self.quotes.is_empty()
}
pub fn len(&self) -> usize {
self.quotes.len()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProfileUpdate {
pub quote: Option<Quote>,
pub similar: Option<Vec<SimpleQuote>>,
pub sector_performance: Option<MarketSector>,
pub news: Option<Vec<News>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MoversUpdate {
pub actives: Vec<MarketMover>,
pub gainers: Vec<MarketMover>,
pub losers: Vec<MarketMover>,
pub timestamp: DateTime<Utc>,
}
impl MoversUpdate {
pub fn new(
actives: Vec<MarketMover>,
gainers: Vec<MarketMover>,
losers: Vec<MarketMover>,
) -> Self {
Self {
actives,
gainers,
losers,
timestamp: Utc::now(),
}
}
pub fn with_timestamp(
actives: Vec<MarketMover>,
gainers: Vec<MarketMover>,
losers: Vec<MarketMover>,
timestamp: DateTime<Utc>,
) -> Self {
Self {
actives,
gainers,
losers,
timestamp,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MarketHours {
pub status: String,
pub reason: Option<String>,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MovingAverageUpdate {
pub symbol: String,
pub indicator_type: String,
pub period: i32,
pub value: f64,
pub timestamp: DateTime<Utc>,
}