Skip to main content

ek_data/
symbol.rs

1//! vt_symbol 约定:`"<exchange>.<symbol>"`(如 `CFFEX.IF2506`)。
2//!
3//! Python 原稿:`trader/utility.py` 的 `extract_vt_symbol`;
4//! object.py 各对象 `__post_init__` 组装 `en_symbol` 的同一约定,
5//! Rust 版集中于本模块(对象侧调 [`vt_symbol`] 组装)。
6
7use crate::constant::Exchange;
8use std::fmt;
9use std::str::FromStr;
10
11/// 组装 vt_symbol(exchange 线值 + "." + symbol)。
12pub fn vt_symbol(symbol: &str, exchange: Exchange) -> String {
13    format!("{}.{}", exchange.as_str(), symbol)
14}
15
16/// vt_symbol 解析失败。
17#[derive(Debug, Clone, PartialEq, Eq)]
18pub enum SymbolError {
19    /// 不是 `exchange.symbol` 两段形(缺 `.` 或 exchange 段丢失)
20    Malformed,
21    /// 前段不是已注册交易所线值
22    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
36/// 解折 vt_symbol → (symbol, exchange)。
37///
38/// 语义对齐 `extract_vt_symbol`:**首个** `.` 前为交易所段(symbol 段允许含 `.`)。
39pub 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}