use std::fmt::{self, Debug, Display};
use enum_map::Enum;
use exchange::adapter::MarketKind;
use serde::{Deserialize, Serialize};
pub trait Indicator: PartialEq + Display + 'static {
fn for_market(market: MarketKind) -> &'static [Self]
where
Self: Sized;
}
#[derive(Debug, Clone, Copy, PartialEq, Deserialize, Serialize, Eq, Enum)]
pub enum KlineIndicator {
Volume,
OpenInterest,
}
impl Indicator for KlineIndicator {
fn for_market(market: MarketKind) -> &'static [Self] {
match market {
MarketKind::Spot => &Self::FOR_SPOT,
MarketKind::LinearPerps | MarketKind::InversePerps => &Self::FOR_PERPS,
}
}
}
impl KlineIndicator {
const FOR_SPOT: [KlineIndicator; 1] = [KlineIndicator::Volume];
const FOR_PERPS: [KlineIndicator; 2] = [KlineIndicator::Volume, KlineIndicator::OpenInterest];
}
impl Display for KlineIndicator {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
KlineIndicator::Volume => write!(f, "Volume"),
KlineIndicator::OpenInterest => write!(f, "Open Interest"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Deserialize, Serialize, Eq, Enum)]
pub enum HeatmapIndicator {
Volume,
}
impl Indicator for HeatmapIndicator {
fn for_market(market: MarketKind) -> &'static [Self] {
match market {
MarketKind::Spot => &Self::FOR_SPOT,
MarketKind::LinearPerps | MarketKind::InversePerps => &Self::FOR_PERPS,
}
}
}
impl HeatmapIndicator {
const FOR_SPOT: [HeatmapIndicator; 1] = [HeatmapIndicator::Volume];
const FOR_PERPS: [HeatmapIndicator; 1] = [HeatmapIndicator::Volume];
}
impl Display for HeatmapIndicator {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
HeatmapIndicator::Volume => write!(f, "Volume"),
}
}
}
#[derive(Debug, Clone, Copy)]
pub enum UiIndicator {
Heatmap(HeatmapIndicator),
Kline(KlineIndicator),
}
impl From<KlineIndicator> for UiIndicator {
fn from(k: KlineIndicator) -> Self {
UiIndicator::Kline(k)
}
}
impl From<HeatmapIndicator> for UiIndicator {
fn from(h: HeatmapIndicator) -> Self {
UiIndicator::Heatmap(h)
}
}