architect-api 11.6.3

Architect.xyz Trading Platform API
Documentation
use anyhow::anyhow;
use chrono::TimeDelta;
use derive_more::Display;
use schemars::JsonSchema_repr;
use serde_repr::{Deserialize_repr, Serialize_repr};
use std::str::FromStr;

#[derive(
    Debug,
    Display,
    Clone,
    Copy,
    PartialEq,
    Eq,
    PartialOrd,
    Ord,
    strum::EnumIter,
    Hash,
    Serialize_repr,
    Deserialize_repr,
    JsonSchema_repr,
)]
#[cfg_attr(feature = "juniper", derive(juniper::GraphQLEnum))]
#[repr(i32)]
pub enum CandleWidth {
    OneSecond = 1,
    FiveSecond = 5,
    OneMinute = 60,
    TwoMinute = 120,
    ThreeMinute = 180,
    FifteenMinute = 900,
    OneHour = 3600,
    OneDay = 86400,
}

impl CandleWidth {
    pub fn all() -> Vec<Self> {
        vec![
            Self::OneSecond,
            Self::FiveSecond,
            Self::OneMinute,
            Self::TwoMinute,
            Self::ThreeMinute,
            Self::FifteenMinute,
            Self::OneHour,
            Self::OneDay,
        ]
    }

    pub fn as_str(&self) -> &'static str {
        match self {
            Self::OneSecond => "1s",
            Self::FiveSecond => "5s",
            Self::OneMinute => "1m",
            Self::TwoMinute => "2m",
            Self::ThreeMinute => "3m",
            Self::FifteenMinute => "15m",
            Self::OneHour => "1h",
            Self::OneDay => "1d",
        }
    }

    pub fn as_seconds(&self) -> i64 {
        match self {
            Self::OneSecond => 1,
            Self::FiveSecond => 5,
            Self::OneMinute => 60,
            Self::TwoMinute => 120,
            Self::ThreeMinute => 180,
            Self::FifteenMinute => 900,
            Self::OneHour => 3600,
            Self::OneDay => 86400,
        }
    }
}

impl FromStr for CandleWidth {
    type Err = anyhow::Error;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s {
            "1s" => Ok(Self::OneSecond),
            "5s" => Ok(Self::FiveSecond),
            "1m" => Ok(Self::OneMinute),
            "2m" => Ok(Self::TwoMinute),
            "3m" => Ok(Self::ThreeMinute),
            "15m" => Ok(Self::FifteenMinute),
            "1h" => Ok(Self::OneHour),
            "1d" => Ok(Self::OneDay),
            _ => Err(anyhow!("invalid candle width: {}", s)),
        }
    }
}

impl From<CandleWidth> for TimeDelta {
    fn from(val: CandleWidth) -> Self {
        TimeDelta::seconds(val.as_seconds())
    }
}