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