1pub mod aggregator;
9pub mod alpaca;
10pub mod errors;
11pub mod polygon;
12pub mod rest;
13pub mod types;
14pub mod websocket;
15
16pub use aggregator::MarketDataAggregator;
17pub use alpaca::AlpacaClient;
18pub use errors::{MarketDataError, Result};
19pub use polygon::{PolygonClient, PolygonWebSocket};
20pub use types::{Bar, Quote, Tick, Timeframe, Trade};
21
22use async_trait::async_trait;
23use futures::Stream;
24use std::pin::Pin;
25
26#[async_trait]
28pub trait MarketDataProvider: Send + Sync {
29 async fn get_quote(&self, symbol: &str) -> Result<Quote>;
31
32 async fn get_bars(
34 &self,
35 symbol: &str,
36 start: chrono::DateTime<chrono::Utc>,
37 end: chrono::DateTime<chrono::Utc>,
38 timeframe: Timeframe,
39 ) -> Result<Vec<Bar>>;
40
41 async fn subscribe_quotes(&self, symbols: Vec<String>) -> Result<QuoteStream>;
43
44 async fn subscribe_trades(&self, symbols: Vec<String>) -> Result<TradeStream>;
46
47 async fn health_check(&self) -> Result<HealthStatus>;
49}
50
51pub type QuoteStream = Pin<Box<dyn Stream<Item = Result<Quote>> + Send>>;
52pub type TradeStream = Pin<Box<dyn Stream<Item = Result<Trade>> + Send>>;
53
54#[derive(Debug, Clone, Copy, PartialEq, Eq)]
55pub enum HealthStatus {
56 Healthy,
57 Degraded,
58 Unhealthy,
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64
65 #[test]
66 fn test_module_structure() {
67 assert_eq!(HealthStatus::Healthy, HealthStatus::Healthy);
69 }
70}