nautilus_serialization/sbe/market/
data_any.rs1use nautilus_model::data::{
17 Bar, FundingRateUpdate, IndexPriceUpdate, InstrumentClose, InstrumentStatus, MarkPriceUpdate,
18 OptionGreeks, 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::OptionGreeks(value) => {
69 writer.write_u16_le(data_any_variant::OPTION_GREEKS);
70 <OptionGreeks as MarketSbeMessage>::encode_body(value, writer)
71 }
72 Self::InstrumentStatus(value) => {
73 writer.write_u16_le(data_any_variant::INSTRUMENT_STATUS);
74 <InstrumentStatus as MarketSbeMessage>::encode_body(value, writer)
75 }
76 Self::InstrumentClose(value) => {
77 writer.write_u16_le(data_any_variant::INSTRUMENT_CLOSE);
78 <InstrumentClose as MarketSbeMessage>::encode_body(value, writer)
79 }
80 }
81 }
82
83 fn decode_body(cursor: &mut SbeCursor<'_>) -> Result<Self, SbeDecodeError> {
84 let variant = cursor.read_u16_le()?;
85
86 match variant {
87 data_any_variant::ORDER_BOOK_DELTA => Ok(Self::OrderBookDelta(
88 <OrderBookDelta as MarketSbeMessage>::decode_body(cursor)?,
89 )),
90 data_any_variant::ORDER_BOOK_DELTAS => Ok(Self::OrderBookDeltas(
91 <OrderBookDeltas as MarketSbeMessage>::decode_body(cursor)?,
92 )),
93 data_any_variant::ORDER_BOOK_DEPTH10 => Ok(Self::OrderBookDepth10(
94 <OrderBookDepth10 as MarketSbeMessage>::decode_body(cursor)?,
95 )),
96 data_any_variant::QUOTE => Ok(Self::Quote(
97 <QuoteTick as MarketSbeMessage>::decode_body(cursor)?,
98 )),
99 data_any_variant::TRADE => Ok(Self::Trade(
100 <TradeTick as MarketSbeMessage>::decode_body(cursor)?,
101 )),
102 data_any_variant::BAR => Ok(Self::Bar(<Bar as MarketSbeMessage>::decode_body(cursor)?)),
103 data_any_variant::MARK_PRICE => Ok(Self::MarkPrice(
104 <MarkPriceUpdate as MarketSbeMessage>::decode_body(cursor)?,
105 )),
106 data_any_variant::INDEX_PRICE => Ok(Self::IndexPrice(
107 <IndexPriceUpdate as MarketSbeMessage>::decode_body(cursor)?,
108 )),
109 data_any_variant::FUNDING_RATE => Ok(Self::FundingRate(
110 <FundingRateUpdate as MarketSbeMessage>::decode_body(cursor)?,
111 )),
112 data_any_variant::OPTION_GREEKS => Ok(Self::OptionGreeks(
113 <OptionGreeks as MarketSbeMessage>::decode_body(cursor)?,
114 )),
115 data_any_variant::INSTRUMENT_STATUS => Ok(Self::InstrumentStatus(
116 <InstrumentStatus as MarketSbeMessage>::decode_body(cursor)?,
117 )),
118 data_any_variant::INSTRUMENT_CLOSE => Ok(Self::InstrumentClose(
119 <InstrumentClose as MarketSbeMessage>::decode_body(cursor)?,
120 )),
121 _ => Err(SbeDecodeError::InvalidEnumValue {
122 type_name: "DataAny",
123 value: variant,
124 }),
125 }
126 }
127
128 fn encoded_body_size(&self) -> usize {
129 usize::from(Self::BLOCK_LENGTH)
130 + match self {
131 Self::OrderBookDelta(value) => value.encoded_body_size(),
132 Self::OrderBookDeltas(value) => value.encoded_body_size(),
133 Self::OrderBookDepth10(value) => value.encoded_body_size(),
134 Self::Quote(value) => value.encoded_body_size(),
135 Self::Trade(value) => value.encoded_body_size(),
136 Self::Bar(value) => value.encoded_body_size(),
137 Self::MarkPrice(value) => value.encoded_body_size(),
138 Self::IndexPrice(value) => value.encoded_body_size(),
139 Self::FundingRate(value) => value.encoded_body_size(),
140 Self::OptionGreeks(value) => value.encoded_body_size(),
141 Self::InstrumentStatus(value) => value.encoded_body_size(),
142 Self::InstrumentClose(value) => value.encoded_body_size(),
143 }
144 }
145}
146
147impl From<OrderBookDelta> for DataAny {
148 fn from(value: OrderBookDelta) -> Self {
149 Self::OrderBookDelta(value)
150 }
151}
152
153impl From<OrderBookDeltas> for DataAny {
154 fn from(value: OrderBookDeltas) -> Self {
155 Self::OrderBookDeltas(value)
156 }
157}
158
159impl From<OrderBookDepth10> for DataAny {
160 fn from(value: OrderBookDepth10) -> Self {
161 Self::OrderBookDepth10(value)
162 }
163}
164
165impl From<QuoteTick> for DataAny {
166 fn from(value: QuoteTick) -> Self {
167 Self::Quote(value)
168 }
169}
170
171impl From<TradeTick> for DataAny {
172 fn from(value: TradeTick) -> Self {
173 Self::Trade(value)
174 }
175}
176
177impl From<Bar> for DataAny {
178 fn from(value: Bar) -> Self {
179 Self::Bar(value)
180 }
181}
182
183impl From<MarkPriceUpdate> for DataAny {
184 fn from(value: MarkPriceUpdate) -> Self {
185 Self::MarkPrice(value)
186 }
187}
188
189impl From<IndexPriceUpdate> for DataAny {
190 fn from(value: IndexPriceUpdate) -> Self {
191 Self::IndexPrice(value)
192 }
193}
194
195impl From<FundingRateUpdate> for DataAny {
196 fn from(value: FundingRateUpdate) -> Self {
197 Self::FundingRate(value)
198 }
199}
200
201impl From<OptionGreeks> for DataAny {
202 fn from(value: OptionGreeks) -> Self {
203 Self::OptionGreeks(value)
204 }
205}
206
207impl From<InstrumentStatus> for DataAny {
208 fn from(value: InstrumentStatus) -> Self {
209 Self::InstrumentStatus(value)
210 }
211}
212
213impl From<InstrumentClose> for DataAny {
214 fn from(value: InstrumentClose) -> Self {
215 Self::InstrumentClose(value)
216 }
217}