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