nautilus_serialization/sbe/market/
data_any.rs1use nautilus_model::data::{
17 Bar, FundingRateUpdate, IndexPriceUpdate, InstrumentClose, InstrumentStatus, MarkPriceUpdate,
18 OrderBookDelta, OrderBookDeltas, OrderBookDepth10, QuoteTick, TradeTick,
19};
20
21use super::{
22 super::{SbeCursor, SbeDecodeError, SbeEncodeError, SbeWriter},
23 DataAny, MarketSbeMessage, data_any_variant, template_id,
24};
25
26impl MarketSbeMessage for DataAny {
27 const TEMPLATE_ID: u16 = template_id::DATA_ANY;
28 const BLOCK_LENGTH: u16 = 2;
29
30 fn encode_body(&self, writer: &mut SbeWriter<'_>) -> Result<(), SbeEncodeError> {
31 match self {
32 Self::OrderBookDelta(value) => {
33 writer.write_u16_le(data_any_variant::ORDER_BOOK_DELTA);
34 <OrderBookDelta as MarketSbeMessage>::encode_body(value, writer)
35 }
36 Self::OrderBookDeltas(value) => {
37 writer.write_u16_le(data_any_variant::ORDER_BOOK_DELTAS);
38 <OrderBookDeltas as MarketSbeMessage>::encode_body(value, writer)
39 }
40 Self::OrderBookDepth10(value) => {
41 writer.write_u16_le(data_any_variant::ORDER_BOOK_DEPTH10);
42 <OrderBookDepth10 as MarketSbeMessage>::encode_body(value, writer)
43 }
44 Self::Quote(value) => {
45 writer.write_u16_le(data_any_variant::QUOTE);
46 <QuoteTick as MarketSbeMessage>::encode_body(value, writer)
47 }
48 Self::Trade(value) => {
49 writer.write_u16_le(data_any_variant::TRADE);
50 <TradeTick as MarketSbeMessage>::encode_body(value, writer)
51 }
52 Self::Bar(value) => {
53 writer.write_u16_le(data_any_variant::BAR);
54 <Bar as MarketSbeMessage>::encode_body(value, writer)
55 }
56 Self::MarkPrice(value) => {
57 writer.write_u16_le(data_any_variant::MARK_PRICE);
58 <MarkPriceUpdate as MarketSbeMessage>::encode_body(value, writer)
59 }
60 Self::IndexPrice(value) => {
61 writer.write_u16_le(data_any_variant::INDEX_PRICE);
62 <IndexPriceUpdate as MarketSbeMessage>::encode_body(value, writer)
63 }
64 Self::FundingRate(value) => {
65 writer.write_u16_le(data_any_variant::FUNDING_RATE);
66 <FundingRateUpdate as MarketSbeMessage>::encode_body(value, writer)
67 }
68 Self::InstrumentStatus(value) => {
69 writer.write_u16_le(data_any_variant::INSTRUMENT_STATUS);
70 <InstrumentStatus as MarketSbeMessage>::encode_body(value, writer)
71 }
72 Self::InstrumentClose(value) => {
73 writer.write_u16_le(data_any_variant::INSTRUMENT_CLOSE);
74 <InstrumentClose as MarketSbeMessage>::encode_body(value, writer)
75 }
76 }
77 }
78
79 fn decode_body(cursor: &mut SbeCursor<'_>) -> Result<Self, SbeDecodeError> {
80 let variant = cursor.read_u16_le()?;
81
82 match variant {
83 data_any_variant::ORDER_BOOK_DELTA => Ok(Self::OrderBookDelta(
84 <OrderBookDelta as MarketSbeMessage>::decode_body(cursor)?,
85 )),
86 data_any_variant::ORDER_BOOK_DELTAS => Ok(Self::OrderBookDeltas(
87 <OrderBookDeltas as MarketSbeMessage>::decode_body(cursor)?,
88 )),
89 data_any_variant::ORDER_BOOK_DEPTH10 => Ok(Self::OrderBookDepth10(
90 <OrderBookDepth10 as MarketSbeMessage>::decode_body(cursor)?,
91 )),
92 data_any_variant::QUOTE => Ok(Self::Quote(
93 <QuoteTick as MarketSbeMessage>::decode_body(cursor)?,
94 )),
95 data_any_variant::TRADE => Ok(Self::Trade(
96 <TradeTick as MarketSbeMessage>::decode_body(cursor)?,
97 )),
98 data_any_variant::BAR => Ok(Self::Bar(<Bar as MarketSbeMessage>::decode_body(cursor)?)),
99 data_any_variant::MARK_PRICE => Ok(Self::MarkPrice(
100 <MarkPriceUpdate as MarketSbeMessage>::decode_body(cursor)?,
101 )),
102 data_any_variant::INDEX_PRICE => Ok(Self::IndexPrice(
103 <IndexPriceUpdate as MarketSbeMessage>::decode_body(cursor)?,
104 )),
105 data_any_variant::FUNDING_RATE => Ok(Self::FundingRate(
106 <FundingRateUpdate as MarketSbeMessage>::decode_body(cursor)?,
107 )),
108 data_any_variant::INSTRUMENT_STATUS => Ok(Self::InstrumentStatus(
109 <InstrumentStatus as MarketSbeMessage>::decode_body(cursor)?,
110 )),
111 data_any_variant::INSTRUMENT_CLOSE => Ok(Self::InstrumentClose(
112 <InstrumentClose as MarketSbeMessage>::decode_body(cursor)?,
113 )),
114 _ => Err(SbeDecodeError::InvalidEnumValue {
115 type_name: "DataAny",
116 value: variant,
117 }),
118 }
119 }
120
121 fn encoded_body_size(&self) -> usize {
122 usize::from(Self::BLOCK_LENGTH)
123 + match self {
124 Self::OrderBookDelta(value) => value.encoded_body_size(),
125 Self::OrderBookDeltas(value) => value.encoded_body_size(),
126 Self::OrderBookDepth10(value) => value.encoded_body_size(),
127 Self::Quote(value) => value.encoded_body_size(),
128 Self::Trade(value) => value.encoded_body_size(),
129 Self::Bar(value) => value.encoded_body_size(),
130 Self::MarkPrice(value) => value.encoded_body_size(),
131 Self::IndexPrice(value) => value.encoded_body_size(),
132 Self::FundingRate(value) => value.encoded_body_size(),
133 Self::InstrumentStatus(value) => value.encoded_body_size(),
134 Self::InstrumentClose(value) => value.encoded_body_size(),
135 }
136 }
137}
138
139impl From<OrderBookDelta> for DataAny {
140 fn from(value: OrderBookDelta) -> Self {
141 Self::OrderBookDelta(value)
142 }
143}
144
145impl From<OrderBookDeltas> for DataAny {
146 fn from(value: OrderBookDeltas) -> Self {
147 Self::OrderBookDeltas(value)
148 }
149}
150
151impl From<OrderBookDepth10> for DataAny {
152 fn from(value: OrderBookDepth10) -> Self {
153 Self::OrderBookDepth10(value)
154 }
155}
156
157impl From<QuoteTick> for DataAny {
158 fn from(value: QuoteTick) -> Self {
159 Self::Quote(value)
160 }
161}
162
163impl From<TradeTick> for DataAny {
164 fn from(value: TradeTick) -> Self {
165 Self::Trade(value)
166 }
167}
168
169impl From<Bar> for DataAny {
170 fn from(value: Bar) -> Self {
171 Self::Bar(value)
172 }
173}
174
175impl From<MarkPriceUpdate> for DataAny {
176 fn from(value: MarkPriceUpdate) -> Self {
177 Self::MarkPrice(value)
178 }
179}
180
181impl From<IndexPriceUpdate> for DataAny {
182 fn from(value: IndexPriceUpdate) -> Self {
183 Self::IndexPrice(value)
184 }
185}
186
187impl From<FundingRateUpdate> for DataAny {
188 fn from(value: FundingRateUpdate) -> Self {
189 Self::FundingRate(value)
190 }
191}
192
193impl From<InstrumentStatus> for DataAny {
194 fn from(value: InstrumentStatus) -> Self {
195 Self::InstrumentStatus(value)
196 }
197}
198
199impl From<InstrumentClose> for DataAny {
200 fn from(value: InstrumentClose) -> Self {
201 Self::InstrumentClose(value)
202 }
203}