finance_query_core/websocket/
mod.rs1use chrono::{DateTime, Utc};
7use serde::{Deserialize, Serialize};
8
9use crate::models::{Quote, SimpleQuote, News};
10use crate::models::movers::MarketMover;
11use crate::models::sectors::MarketSector;
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct QuotesUpdate {
18 pub quotes: Vec<SimpleQuote>,
20 pub timestamp: DateTime<Utc>,
22}
23
24impl QuotesUpdate {
25 pub fn single(quote: SimpleQuote) -> Self {
27 Self {
28 quotes: vec![quote],
29 timestamp: Utc::now(),
30 }
31 }
32
33 pub fn multiple(quotes: Vec<SimpleQuote>) -> Self {
35 Self {
36 quotes,
37 timestamp: Utc::now(),
38 }
39 }
40
41 pub fn with_timestamp(quotes: Vec<SimpleQuote>, timestamp: DateTime<Utc>) -> Self {
43 Self { quotes, timestamp }
44 }
45
46 pub fn contains_symbol(&self, symbol: &str) -> bool {
48 self.quotes.iter().any(|q| q.symbol == symbol)
49 }
50
51 pub fn get_quote(&self, symbol: &str) -> Option<&SimpleQuote> {
53 self.quotes.iter().find(|q| q.symbol == symbol)
54 }
55
56 pub fn is_empty(&self) -> bool {
58 self.quotes.is_empty()
59 }
60
61 pub fn len(&self) -> usize {
63 self.quotes.len()
64 }
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize)]
69pub struct ProfileUpdate {
70 pub quote: Option<Quote>,
72 pub similar: Option<Vec<SimpleQuote>>,
74 pub sector_performance: Option<MarketSector>,
76 pub news: Option<Vec<News>>,
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize)]
82pub struct MoversUpdate {
83 pub actives: Option<Vec<MarketMover>>,
85 pub gainers: Option<Vec<MarketMover>>,
87 pub losers: Option<Vec<MarketMover>>,
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize)]
93pub struct MarketHours {
94 pub status: String,
96 pub reason: Option<String>,
98 pub timestamp: DateTime<Utc>,
100}
101
102#[derive(Debug, Clone, Serialize, Deserialize)]
104pub struct MovingAverageUpdate {
105 pub symbol: String,
107 pub indicator_type: String,
109 pub period: i32,
111 pub value: f64,
113 pub timestamp: DateTime<Utc>,
115}