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, 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}