1use crate::constant::Exchange;
8use std::fmt;
9use std::str::FromStr;
10
11pub fn vt_symbol(symbol: &str, exchange: Exchange) -> String {
13 format!("{}.{}", exchange.as_str(), symbol)
14}
15
16#[derive(Debug, Clone, PartialEq, Eq)]
18pub enum SymbolError {
19 Malformed,
21 UnknownExchange(String),
23}
24
25impl fmt::Display for SymbolError {
26 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
27 match self {
28 Self::Malformed => f.write_str("malformed vt_symbol, expect `<exchange>.<symbol>`"),
29 Self::UnknownExchange(s) => write!(f, "unknown exchange: {s}"),
30 }
31 }
32}
33
34impl std::error::Error for SymbolError {}
35
36pub fn parse_vt_symbol(vt: &str) -> Result<(String, Exchange), SymbolError> {
40 let Some((head, tail)) = vt.split_once('.') else {
41 return Err(SymbolError::Malformed);
42 };
43 if head.is_empty() {
44 return Err(SymbolError::Malformed);
45 }
46 Exchange::from_str(head)
47 .map(|ex| (tail.to_string(), ex))
48 .map_err(|_| SymbolError::UnknownExchange(head.to_string()))
49}