use crate::core::types::Symbol;
#[derive(Debug, Clone)]
pub struct MoexEndpoints {
pub rest_base: &'static str,
pub ws_base: Option<&'static str>,
}
impl Default for MoexEndpoints {
fn default() -> Self {
Self {
rest_base: "https://iss.moex.com/iss",
ws_base: Some("wss://iss.moex.com/infocx/v3/websocket"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MoexEndpoint {
Engines,
EngineMarkets,
MarketBoards,
Securities,
SecurityInfo,
MarketSecurities,
SecurityMarketData,
BoardSecurityData,
SecurityTrades,
SecurityOrderbook,
Candles,
BoardCandles,
CandleBorders,
HistoricalData,
BoardHistory,
StockIndices,
IndexAnalytics,
FuturesSeries,
OptionsSeries,
OpenInterest,
Turnovers,
EngineTurnovers,
CompanyInfo,
CorporateActions,
ConsensusForecasts,
}
impl MoexEndpoint {
pub fn path(&self) -> &'static str {
match self {
Self::Engines => "/engines.json",
Self::EngineMarkets => "/engines/{engine}/markets.json",
Self::MarketBoards => "/engines/{engine}/markets/{market}/boards.json",
Self::Securities => "/securities.json",
Self::SecurityInfo => "/securities/{security}.json",
Self::MarketSecurities => "/engines/{engine}/markets/{market}/securities.json",
Self::SecurityMarketData => "/engines/{engine}/markets/{market}/securities/{security}.json",
Self::BoardSecurityData => "/engines/{engine}/markets/{market}/boards/{board}/securities/{security}.json",
Self::SecurityTrades => "/engines/{engine}/markets/{market}/securities/{security}/trades.json",
Self::SecurityOrderbook => "/engines/{engine}/markets/{market}/securities/{security}/orderbook.json",
Self::Candles => "/engines/{engine}/markets/{market}/securities/{security}/candles.json",
Self::BoardCandles => "/engines/{engine}/markets/{market}/boards/{board}/securities/{security}/candles.json",
Self::CandleBorders => "/engines/{engine}/markets/{market}/securities/{security}/candleborders.json",
Self::HistoricalData => "/history/engines/{engine}/markets/{market}/securities/{security}.json",
Self::BoardHistory => "/history/engines/{engine}/markets/{market}/boards/{board}/securities/{security}.json",
Self::StockIndices => "/statistics/engines/stock/markets/index/analytics.json",
Self::IndexAnalytics => "/statistics/engines/stock/markets/index/analytics/{indexid}.json",
Self::FuturesSeries => "/statistics/engines/futures/markets/forts/series.json",
Self::OptionsSeries => "/statistics/engines/futures/markets/options/assets.json",
Self::OpenInterest => "/statistics/engines/futures/markets/{market}/openpositions/{asset}.json",
Self::Turnovers => "/turnovers.json",
Self::EngineTurnovers => "/engines/{engine}/turnovers.json",
Self::CompanyInfo => "/cci/info/companies.json",
Self::CorporateActions => "/cci/corp-actions.json",
Self::ConsensusForecasts => "/cci/consensus/shares-price.json",
}
}
pub fn build_path(&self, params: &[(&str, &str)]) -> String {
let mut path = self.path().to_string();
for (key, value) in params {
let placeholder = format!("{{{}}}", key);
path = path.replace(&placeholder, value);
}
path
}
}
pub fn _parse_symbol(api_symbol: &str) -> Symbol {
Symbol {
base: api_symbol.to_uppercase(),
quote: "RUB".to_string(), raw: Some(api_symbol.to_string()),
}
}
pub fn map_interval(interval: &str) -> i32 {
match interval {
"1m" => 1,
"10m" => 10,
"1h" | "60m" => 60,
"1d" => 24 * 60, "1w" => 7 * 24 * 60, "1M" => 31 * 24 * 60, "1Q" => 4 * 31 * 24 * 60, _ => 60, }
}
pub const DEFAULT_ENGINE: &str = "stock";
pub const DEFAULT_MARKET: &str = "shares";
pub const DEFAULT_BOARD: &str = "TQBR";
pub fn default_stock_params() -> (&'static str, &'static str, &'static str) {
(DEFAULT_ENGINE, DEFAULT_MARKET, DEFAULT_BOARD)
}