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 serde::{Deserialize, Serialize};
use rust_decimal::Decimal;
use crate::{GeneratorConfig, OHLC, Tick};
use utoipa::ToSchema;

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct GenerateRequest {
    pub count: usize,
    #[serde(default)]
    pub format: DataFormat,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub config: Option<GeneratorConfig>,
}

#[derive(Debug, Serialize, Deserialize, ToSchema, Default)]
#[serde(rename_all = "lowercase")]
pub enum DataFormat {
    #[default]
    Ohlc,
    Tick,
    Both,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct GenerateResponse {
    pub symbol: String,
    pub data: MarketDataResponse,
    pub metadata: ResponseMetadata,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
#[serde(untagged)]
pub enum MarketDataResponse {
    Ohlc(Vec<OHLC>),
    Tick(Vec<Tick>),
    Both {
        ohlc: Vec<OHLC>,
        ticks: Vec<Tick>,
    },
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct ResponseMetadata {
    pub generated_at: chrono::DateTime<chrono::Utc>,
    pub count: usize,
    pub format: String,
    pub generator_version: String,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct CreateSymbolRequest {
    pub symbol: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub config: Option<GeneratorConfig>,
    #[serde(default)]
    pub auto_start: bool,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct SymbolInfo {
    pub symbol: String,
    pub active: bool,
    pub created_at: chrono::DateTime<chrono::Utc>,
    pub config: GeneratorConfig,
    pub statistics: Option<SymbolStatistics>,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct SymbolStatistics {
    pub total_generated: u64,
    pub last_price: Decimal,
    pub high_24h: Decimal,
    pub low_24h: Decimal,
    pub volume_24h: Decimal,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct ApiCapabilities {
    pub version: String,
    pub features: Vec<String>,
    pub export_formats: Vec<String>,
    pub algorithms: Vec<AlgorithmInfo>,
    pub presets: Vec<PresetInfo>,
    pub websocket: WebSocketInfo,
    pub limits: ApiLimits,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct AlgorithmInfo {
    pub name: String,
    pub description: String,
    pub parameters: Vec<ParameterInfo>,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct ParameterInfo {
    pub name: String,
    pub data_type: String,
    pub description: String,
    pub default_value: serde_json::Value,
    pub constraints: Option<serde_json::Value>,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct PresetInfo {
    pub name: String,
    pub description: String,
    pub algorithm: String,
    pub suitable_for: Vec<String>,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct WebSocketInfo {
    pub endpoint: String,
    pub protocols: Vec<String>,
    pub message_types: Vec<String>,
    pub max_subscriptions_per_connection: u32,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct ApiLimits {
    pub max_data_points_per_request: u32,
    pub max_symbols: u32,
    pub max_websocket_connections: u32,
    pub rate_limit: Option<RateLimitInfo>,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct RateLimitInfo {
    pub requests_per_second: u32,
    pub burst_size: u32,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct HistoricalDataRequest {
    pub from: Option<chrono::DateTime<chrono::Utc>>,
    pub to: Option<chrono::DateTime<chrono::Utc>>,
    pub interval: Option<String>,
    pub limit: Option<usize>,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct ErrorResponse {
    pub error: String,
    pub code: u16,
    pub details: Option<serde_json::Value>,
}