stock-trek 0.7.5

Stock Trek time-series analysis
Documentation
use crate::exchange_id::ExchangeId;
use serde::{Deserialize, Serialize};
use strum::Display;

#[derive(Debug, Display, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Capability {
    MultiLeg(MultiLegCapability),
    QuoteQuantity(QuoteQuantityCapability),
}

#[derive(Debug, Display, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum MultiLegCapability {
    AllowDifferentSymbol,
    AllowDifferentPricing,
    AllowDifferentTiming,
    OneCancelsOther,
    OneTriggersOther,
    OneTriggersOco,
}

#[derive(Debug, Display, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum QuoteQuantityCapability {
    AllowTriggeredTiming,
    AllowLimitPricing,
}

pub trait Capabilities {
    fn exchange_id(&self) -> ExchangeId;
    fn capabilities(&self) -> Vec<Capability>;
}

pub trait HasRequiredCapabilities {
    fn required_capabilities(&self) -> Vec<Capability>;
}

pub fn combine_capabilities<T: HasRequiredCapabilities + ?Sized>(array: &[&T]) -> Vec<Capability> {
    let mut capabilities = Vec::new();
    for element in array {
        capabilities.extend(element.required_capabilities());
    }
    capabilities
}