market-data-source 0.3.0

High-performance synthetic market data generator with financial precision. Generate unlimited OHLC candles, tick data, and realistic trading scenarios for backtesting and research.
Documentation
use crate::{MarketDataGenerator, GeneratorConfig};
use std::sync::Arc;
use tokio::sync::RwLock;
use std::collections::HashMap;
use super::config::ServerConfig;

#[derive(Clone)]
pub struct AppState {
    pub config: ServerConfig,
    pub generators: Arc<RwLock<HashMap<String, Arc<RwLock<MarketDataGenerator>>>>>,
    pub subscriptions: Arc<RwLock<HashMap<String, Vec<String>>>>,
}

impl AppState {
    pub fn new(config: ServerConfig) -> Self {
        Self {
            config,
            generators: Arc::new(RwLock::new(HashMap::new())),
            subscriptions: Arc::new(RwLock::new(HashMap::new())),
        }
    }
    
    pub async fn get_or_create_generator(&self, symbol: &str) -> Arc<RwLock<MarketDataGenerator>> {
        let mut generators = self.generators.write().await;
        
        generators.entry(symbol.to_string())
            .or_insert_with(|| {
                let config = GeneratorConfig::default();
                Arc::new(RwLock::new(MarketDataGenerator::with_config(config).expect("Failed to create generator")))
            })
            .clone()
    }
    
    pub async fn create_generator_with_config(&self, symbol: &str, config: GeneratorConfig) -> Arc<RwLock<MarketDataGenerator>> {
        let mut generators = self.generators.write().await;
        let generator = Arc::new(RwLock::new(MarketDataGenerator::with_config(config).expect("Failed to create generator")));
        generators.insert(symbol.to_string(), generator.clone());
        generator
    }
    
    pub async fn remove_generator(&self, symbol: &str) -> Option<Arc<RwLock<MarketDataGenerator>>> {
        let mut generators = self.generators.write().await;
        generators.remove(symbol)
    }
    
    pub async fn list_symbols(&self) -> Vec<String> {
        let generators = self.generators.read().await;
        generators.keys().cloned().collect()
    }
}