Skip to content

Commit cf3fc35

Browse files
committed
refactor: extract common header parsing into a macro
1 parent ab852dd commit cf3fc35

1 file changed

Lines changed: 51 additions & 48 deletions

File tree

src/parser.rs

Lines changed: 51 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,17 @@ macro_rules! dispatch_fn {
2222
};
2323
}
2424

25+
macro_rules! parse_common_header {
26+
($self:expr, $data:expr, $pos:expr) => {
27+
(|| -> Result<(u16, u16, u64)> {
28+
let stock_locate = $self.read_u16($data, $pos)?;
29+
let tracking_number = $self.read_u16($data, $pos)?;
30+
let timestamp = $self.read_timestamp($data, $pos)?;
31+
Ok((stock_locate, tracking_number, timestamp))
32+
})()
33+
};
34+
}
35+
2536
#[repr(C, align(64))]
2637
pub struct Parser {
2738
buffer: Vec<u8>,
@@ -490,19 +501,18 @@ impl Parser {
490501

491502
#[inline]
492503
fn parse_system_event(&self, data: &[u8], pos: &mut usize) -> Result<SystemEventMessage> {
504+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
493505
Ok(SystemEventMessage {
494-
stock_locate: self.read_u16(data, pos)?,
495-
tracking_number: self.read_u16(data, pos)?,
496-
timestamp: self.read_timestamp(data, pos)?,
506+
stock_locate,
507+
tracking_number,
508+
timestamp,
497509
event_code: self.read_u8(data, pos)? as char,
498510
})
499511
}
500512

501513
#[inline]
502514
fn parse_stock_directory(&self, data: &[u8], pos: &mut usize) -> Result<StockDirectoryMessage> {
503-
let stock_locate = self.read_u16(data, pos)?;
504-
let tracking_number = self.read_u16(data, pos)?;
505-
let timestamp = self.read_timestamp(data, pos)?;
515+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
506516
let stock = self.read_stock(data, pos)?;
507517
let end = stock.iter().position(|&b| b == b' ').unwrap_or(8);
508518
std::str::from_utf8(&stock[..end])
@@ -537,9 +547,7 @@ impl Parser {
537547
data: &[u8],
538548
pos: &mut usize,
539549
) -> Result<StockTradingActionMessage> {
540-
let stock_locate = self.read_u16(data, pos)?;
541-
let tracking_number = self.read_u16(data, pos)?;
542-
let timestamp = self.read_timestamp(data, pos)?;
550+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
543551
let stock = self.read_stock(data, pos)?;
544552
let end = stock.iter().position(|&b| b == b' ').unwrap_or(8);
545553
std::str::from_utf8(&stock[..end])
@@ -565,9 +573,7 @@ impl Parser {
565573
data: &[u8],
566574
pos: &mut usize,
567575
) -> Result<RegShoRestrictionMessage> {
568-
let stock_locate = self.read_u16(data, pos)?;
569-
let tracking_number = self.read_u16(data, pos)?;
570-
let timestamp = self.read_timestamp(data, pos)?;
576+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
571577
let stock = self.read_stock(data, pos)?;
572578
let end = stock.iter().position(|&b| b == b' ').unwrap_or(8);
573579
std::str::from_utf8(&stock[..end])
@@ -589,9 +595,7 @@ impl Parser {
589595
data: &[u8],
590596
pos: &mut usize,
591597
) -> Result<MarketParticipantPositionMessage> {
592-
let stock_locate = self.read_u16(data, pos)?;
593-
let tracking_number = self.read_u16(data, pos)?;
594-
let timestamp = self.read_timestamp(data, pos)?;
598+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
595599
let mpid = self.read_mpid(data, pos)?;
596600
let end_mpid = mpid.iter().position(|&b| b == b' ').unwrap_or(4);
597601
std::str::from_utf8(&mpid[..end_mpid])
@@ -622,10 +626,11 @@ impl Parser {
622626
data: &[u8],
623627
pos: &mut usize,
624628
) -> Result<MwcbDeclineLevelMessage> {
629+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
625630
Ok(MwcbDeclineLevelMessage {
626-
stock_locate: self.read_u16(data, pos)?,
627-
tracking_number: self.read_u16(data, pos)?,
628-
timestamp: self.read_timestamp(data, pos)?,
631+
stock_locate,
632+
tracking_number,
633+
timestamp,
629634
level1: self.read_u64(data, pos)?,
630635
level2: self.read_u64(data, pos)?,
631636
level3: self.read_u64(data, pos)?,
@@ -634,10 +639,11 @@ impl Parser {
634639

635640
#[inline]
636641
fn parse_mwcb_status(&self, data: &[u8], pos: &mut usize) -> Result<MwcbStatusMessage> {
642+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
637643
Ok(MwcbStatusMessage {
638-
stock_locate: self.read_u16(data, pos)?,
639-
tracking_number: self.read_u16(data, pos)?,
640-
timestamp: self.read_timestamp(data, pos)?,
644+
stock_locate,
645+
tracking_number,
646+
timestamp,
641647
breached_level: self.read_u8(data, pos)? as char,
642648
})
643649
}
@@ -648,9 +654,7 @@ impl Parser {
648654
data: &[u8],
649655
pos: &mut usize,
650656
) -> Result<IpoQuotingPeriodMessage> {
651-
let stock_locate = self.read_u16(data, pos)?;
652-
let tracking_number = self.read_u16(data, pos)?;
653-
let timestamp = self.read_timestamp(data, pos)?;
657+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
654658
let stock = self.read_stock(data, pos)?;
655659
let end = stock.iter().position(|&b| b == b' ').unwrap_or(8);
656660
std::str::from_utf8(&stock[..end])
@@ -669,9 +673,7 @@ impl Parser {
669673

670674
#[inline]
671675
fn parse_add_order(&self, data: &[u8], pos: &mut usize) -> Result<AddOrderMessage> {
672-
let stock_locate = self.read_u16(data, pos)?;
673-
let tracking_number = self.read_u16(data, pos)?;
674-
let timestamp = self.read_timestamp(data, pos)?;
676+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
675677
let order_reference_number = self.read_u64(data, pos)?;
676678
let buy_sell_indicator = self.read_u8(data, pos)? as char;
677679
let shares = self.read_u32(data, pos)?;
@@ -698,9 +700,7 @@ impl Parser {
698700
data: &[u8],
699701
pos: &mut usize,
700702
) -> Result<AddOrderWithMpidMessage> {
701-
let stock_locate = self.read_u16(data, pos)?;
702-
let tracking_number = self.read_u16(data, pos)?;
703-
let timestamp = self.read_timestamp(data, pos)?;
703+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
704704
let order_reference_number = self.read_u64(data, pos)?;
705705
let buy_sell_indicator = self.read_u8(data, pos)? as char;
706706
let shares = self.read_u32(data, pos)?;
@@ -730,10 +730,11 @@ impl Parser {
730730

731731
#[inline]
732732
fn parse_order_executed(&self, data: &[u8], pos: &mut usize) -> Result<OrderExecutedMessage> {
733+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
733734
Ok(OrderExecutedMessage {
734-
stock_locate: self.read_u16(data, pos)?,
735-
tracking_number: self.read_u16(data, pos)?,
736-
timestamp: self.read_timestamp(data, pos)?,
735+
stock_locate,
736+
tracking_number,
737+
timestamp,
737738
order_reference_number: self.read_u64(data, pos)?,
738739
executed_shares: self.read_u32(data, pos)?,
739740
match_number: self.read_u64(data, pos)?,
@@ -746,10 +747,11 @@ impl Parser {
746747
data: &[u8],
747748
pos: &mut usize,
748749
) -> Result<OrderExecutedWithPriceMessage> {
750+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
749751
Ok(OrderExecutedWithPriceMessage {
750-
stock_locate: self.read_u16(data, pos)?,
751-
tracking_number: self.read_u16(data, pos)?,
752-
timestamp: self.read_timestamp(data, pos)?,
752+
stock_locate,
753+
tracking_number,
754+
timestamp,
753755
order_reference_number: self.read_u64(data, pos)?,
754756
executed_shares: self.read_u32(data, pos)?,
755757
match_number: self.read_u64(data, pos)?,
@@ -760,31 +762,34 @@ impl Parser {
760762

761763
#[inline]
762764
fn parse_order_cancel(&self, data: &[u8], pos: &mut usize) -> Result<OrderCancelMessage> {
765+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
763766
Ok(OrderCancelMessage {
764-
stock_locate: self.read_u16(data, pos)?,
765-
tracking_number: self.read_u16(data, pos)?,
766-
timestamp: self.read_timestamp(data, pos)?,
767+
stock_locate,
768+
tracking_number,
769+
timestamp,
767770
order_reference_number: self.read_u64(data, pos)?,
768771
cancelled_shares: self.read_u32(data, pos)?,
769772
})
770773
}
771774

772775
#[inline]
773776
fn parse_order_delete(&self, data: &[u8], pos: &mut usize) -> Result<OrderDeleteMessage> {
777+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
774778
Ok(OrderDeleteMessage {
775-
stock_locate: self.read_u16(data, pos)?,
776-
tracking_number: self.read_u16(data, pos)?,
777-
timestamp: self.read_timestamp(data, pos)?,
779+
stock_locate,
780+
tracking_number,
781+
timestamp,
778782
order_reference_number: self.read_u64(data, pos)?,
779783
})
780784
}
781785

782786
#[inline]
783787
fn parse_order_replace(&self, data: &[u8], pos: &mut usize) -> Result<OrderReplaceMessage> {
788+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
784789
Ok(OrderReplaceMessage {
785-
stock_locate: self.read_u16(data, pos)?,
786-
tracking_number: self.read_u16(data, pos)?,
787-
timestamp: self.read_timestamp(data, pos)?,
790+
stock_locate,
791+
tracking_number,
792+
timestamp,
788793
original_order_reference_number: self.read_u64(data, pos)?,
789794
new_order_reference_number: self.read_u64(data, pos)?,
790795
shares: self.read_u32(data, pos)?,
@@ -794,9 +799,7 @@ impl Parser {
794799

795800
#[inline]
796801
fn parse_trade(&self, data: &[u8], pos: &mut usize) -> Result<TradeMessage> {
797-
let stock_locate = self.read_u16(data, pos)?;
798-
let tracking_number = self.read_u16(data, pos)?;
799-
let timestamp = self.read_timestamp(data, pos)?;
802+
let (stock_locate, tracking_number, timestamp) = parse_common_header!(self, data, pos)?;
800803
let order_reference_number = self.read_u64(data, pos)?;
801804
let buy_sell_indicator = self.read_u8(data, pos)? as char;
802805
let shares = self.read_u32(data, pos)?;

0 commit comments

Comments
 (0)