@@ -414,7 +414,7 @@ impl std::str::FromStr for Symbol {
414414 type Err = eyre:: Report ;
415415
416416 fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
417- let ( pair_str, instrument_ticker_str) = s. split_once ( '.' ) . map ( |( p, i) | ( p, format ! ( ".{i}" ) ) ) . unwrap_or ( ( s, "" . to_owned ( ) ) ) ;
417+ let ( pair_str, instrument_ticker_str) = s. split_once ( '.' ) . map ( |( p, i) | ( p, format ! ( ".{}" , i . to_uppercase ( ) ) ) ) . unwrap_or ( ( s, "" . to_owned ( ) ) ) ;
418418 let pair = Pair :: from_str ( pair_str) ?;
419419 let instrument = Instrument :: from_str ( & instrument_ticker_str) ?;
420420
@@ -486,4 +486,19 @@ mod test {
486486 assert_eq ! ( ticker. symbol. instrument, super :: Instrument :: Perp ) ;
487487 assert_eq ! ( ticker. exchange_name, super :: ExchangeName :: Bybit ) ;
488488 }
489+
490+ #[ test]
491+ fn from_str_case_insensitive ( ) {
492+ // Test lowercase instrument suffix
493+ let ticker_str = "binance:btc-usdt.p" ;
494+ let ticker: super :: Ticker = ticker_str. parse ( ) . unwrap ( ) ;
495+ assert_eq ! ( ticker. symbol. pair, super :: Pair :: new( "BTC" , "USDT" ) ) ;
496+ assert_eq ! ( ticker. symbol. instrument, super :: Instrument :: Perp ) ;
497+ assert_eq ! ( ticker. exchange_name, super :: ExchangeName :: Binance ) ;
498+
499+ // Test mixed case
500+ let ticker_str2 = "bybit:ETH-USDT.pErP_iNvErSe" ;
501+ let ticker2: super :: Ticker = ticker_str2. parse ( ) . unwrap ( ) ;
502+ assert_eq ! ( ticker2. symbol. instrument, super :: Instrument :: PerpInverse ) ;
503+ }
489504}
0 commit comments