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    let mut buf = String::with_capacity(exchange.as_str().len() + 1 + symbol.len());
14    write_vt_symbol(&mut buf, symbol, exchange);
15    buf
16}
17
18/// 零分配组装:把 vt_symbol **追加**到复用缓冲(逐 tick 热路径用,避免每笔一次分配)。
19pub fn write_vt_symbol(buf: &mut String, symbol: &str, exchange: Exchange) {
20    buf.push_str(exchange.as_str());
21    buf.push('.');
22    buf.push_str(symbol);
23}
24
25/// vt_symbol 解析失败。
26#[derive(Debug, Clone, PartialEq, Eq)]
27pub enum SymbolError {
28    /// 不是 `exchange.symbol` 两段形(缺 `.` 或 exchange 段丢失)
29    Malformed,
30    /// 前段不是已注册交易所线值
31    UnknownExchange(String),
32}
33
34impl fmt::Display for SymbolError {
35    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
36        match self {
37            Self::Malformed => f.write_str("malformed vt_symbol, expect `<exchange>.<symbol>`"),
38            Self::UnknownExchange(s) => write!(f, "unknown exchange: {s}"),
39        }
40    }
41}
42
43impl std::error::Error for SymbolError {}
44
45/// 解折 vt_symbol → (symbol, exchange)。
46///
47/// 语义对齐 `extract_vt_symbol`:**首个** `.` 前为交易所段(symbol 段允许含 `.`)。
48pub fn parse_vt_symbol(vt: &str) -> Result<(String, Exchange), SymbolError> {
49    let Some((head, tail)) = vt.split_once('.') else {
50        return Err(SymbolError::Malformed);
51    };
52    if head.is_empty() {
53        return Err(SymbolError::Malformed);
54    }
55    Exchange::from_str(head)
56        .map(|ex| (tail.to_string(), ex))
57        .map_err(|_| SymbolError::UnknownExchange(head.to_string()))
58}