Skip to main content

nautilus_serialization/sbe/market/
data_any.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2026 Nautech Systems Pty Ltd. All rights reserved.
3//  https://nautechsystems.io
4//
5//  Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
6//  You may not use this file except in compliance with the License.
7//  You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
8//
9//  Unless required by applicable law or agreed to in writing, software
10//  distributed under the License is distributed on an "AS IS" BASIS,
11//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//  See the License for the specific language governing permissions and
13//  limitations under the License.
14// -------------------------------------------------------------------------------------------------
15
16use 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}