1#![allow(deprecated)] #![allow(clippy::manual_non_exhaustive)] mod methods;
6
7use std::fmt::{self, Display, Formatter};
8
9#[cfg(not(feature = "python"))]
12use dbn_macros::MockPyo3;
13use num_enum::{IntoPrimitive, TryFromPrimitive};
14
15#[derive(
21 Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, TryFromPrimitive, IntoPrimitive,
22)]
23#[cfg_attr(
24 feature = "python",
25 derive(strum::EnumIter),
26 pyo3::pyclass(from_py_object, module = "databento_dbn")
27)]
28#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
29#[repr(u8)]
30pub enum RType {
31 #[pyo3(name = "MBP_0")]
34 Mbp0 = 0x00,
35 #[pyo3(name = "MBP_1")]
38 Mbp1 = 0x01,
39 #[pyo3(name = "MBP_10")]
41 Mbp10 = 0x0A,
42 #[deprecated(
44 since = "0.3.3",
45 note = "Separated into separate rtypes for each OHLCV schema."
46 )]
47 #[pyo3(name = "OHLCV_DEPRECATED")]
48 OhlcvDeprecated = 0x11,
49 #[pyo3(name = "OHLCV_1S")]
51 Ohlcv1S = 0x20,
52 #[pyo3(name = "OHLCV_1M")]
54 Ohlcv1M = 0x21,
55 #[pyo3(name = "OHLCV_1H")]
57 Ohlcv1H = 0x22,
58 #[pyo3(name = "OHLCV_1D")]
61 Ohlcv1D = 0x23,
62 #[pyo3(name = "OHLCV_EOD")]
65 OhlcvEod = 0x24,
66 #[pyo3(name = "STATUS")]
68 Status = 0x12,
69 #[pyo3(name = "INSTRUMENT_DEF")]
71 InstrumentDef = 0x13,
72 #[pyo3(name = "IMBALANCE")]
74 Imbalance = 0x14,
75 #[pyo3(name = "ERROR")]
77 Error = 0x15,
78 #[pyo3(name = "SYMBOL_MAPPING")]
80 SymbolMapping = 0x16,
81 #[pyo3(name = "SYSTEM")]
83 System = 0x17,
84 #[pyo3(name = "STATISTICS")]
86 Statistics = 0x18,
87 #[pyo3(name = "MBO")]
89 Mbo = 0xA0,
90 #[pyo3(name = "CMBP_1")]
92 Cmbp1 = 0xB1,
93 #[pyo3(name = "CBBO_1S")]
96 Cbbo1S = 0xC0,
97 #[pyo3(name = "CBBO_1M")]
100 Cbbo1M = 0xC1,
101 #[pyo3(name = "TCBBO")]
104 Tcbbo = 0xC2,
105 #[pyo3(name = "BBO_1S")]
107 Bbo1S = 0xC3,
108 #[pyo3(name = "BBO_1M")]
110 Bbo1M = 0xC4,
111}
112
113pub mod rtype {
115 use super::*;
116 pub const MBP_0: u8 = RType::Mbp0 as u8;
119 pub const MBP_1: u8 = RType::Mbp1 as u8;
122 pub const MBP_10: u8 = RType::Mbp10 as u8;
124 pub const OHLCV_DEPRECATED: u8 = RType::OhlcvDeprecated as u8;
126 pub const OHLCV_1S: u8 = RType::Ohlcv1S as u8;
128 pub const OHLCV_1M: u8 = RType::Ohlcv1M as u8;
130 pub const OHLCV_1H: u8 = RType::Ohlcv1H as u8;
132 pub const OHLCV_1D: u8 = RType::Ohlcv1D as u8;
135 pub const OHLCV_EOD: u8 = RType::OhlcvEod as u8;
138 pub const STATUS: u8 = RType::Status as u8;
140 pub const INSTRUMENT_DEF: u8 = RType::InstrumentDef as u8;
142 pub const IMBALANCE: u8 = RType::Imbalance as u8;
144 pub const ERROR: u8 = RType::Error as u8;
146 pub const SYMBOL_MAPPING: u8 = RType::SymbolMapping as u8;
148 pub const SYSTEM: u8 = RType::System as u8;
150 pub const STATISTICS: u8 = RType::Statistics as u8;
152 pub const MBO: u8 = RType::Mbo as u8;
154 pub const CMBP_1: u8 = RType::Cmbp1 as u8;
156 pub const CBBO_1S: u8 = RType::Cbbo1S as u8;
159 pub const CBBO_1M: u8 = RType::Cbbo1M as u8;
162 pub const TCBBO: u8 = RType::Tcbbo as u8;
165 pub const BBO_1S: u8 = RType::Bbo1S as u8;
167 pub const BBO_1M: u8 = RType::Bbo1M as u8;
169}
170
171impl std::str::FromStr for RType {
172 type Err = crate::Error;
173
174 fn from_str(s: &str) -> Result<Self, Self::Err> {
175 match s {
176 "mbp-0" => Ok(Self::Mbp0),
177 "mbp-1" => Ok(Self::Mbp1),
178 "mbp-10" => Ok(Self::Mbp10),
179 #[allow(deprecated)]
180 "ohlcv-deprecated" => Ok(Self::OhlcvDeprecated),
181 "ohlcv-1s" => Ok(Self::Ohlcv1S),
182 "ohlcv-1m" => Ok(Self::Ohlcv1M),
183 "ohlcv-1h" => Ok(Self::Ohlcv1H),
184 "ohlcv-1d" => Ok(Self::Ohlcv1D),
185 "ohlcv-eod" => Ok(Self::OhlcvEod),
186 "status" => Ok(Self::Status),
187 "instrument-def" => Ok(Self::InstrumentDef),
188 "imbalance" => Ok(Self::Imbalance),
189 "error" => Ok(Self::Error),
190 "symbol-mapping" => Ok(Self::SymbolMapping),
191 "system" => Ok(Self::System),
192 "statistics" => Ok(Self::Statistics),
193 "mbo" => Ok(Self::Mbo),
194 "cmbp-1" => Ok(Self::Cmbp1),
195 "cbbo-1s" => Ok(Self::Cbbo1S),
196 "cbbo-1m" => Ok(Self::Cbbo1M),
197 "tcbbo" => Ok(Self::Tcbbo),
198 "bbo-1s" => Ok(Self::Bbo1S),
199 "bbo-1m" => Ok(Self::Bbo1M),
200 _ => Err(crate::Error::conversion::<Self>(s.to_owned())),
201 }
202 }
203}
204
205impl AsRef<str> for RType {
206 fn as_ref(&self) -> &str {
207 self.as_str()
208 }
209}
210
211impl RType {
212 pub const fn as_str(&self) -> &'static str {
214 match self {
215 Self::Mbp0 => "mbp-0",
216 Self::Mbp1 => "mbp-1",
217 Self::Mbp10 => "mbp-10",
218 #[allow(deprecated)]
219 Self::OhlcvDeprecated => "ohlcv-deprecated",
220 Self::Ohlcv1S => "ohlcv-1s",
221 Self::Ohlcv1M => "ohlcv-1m",
222 Self::Ohlcv1H => "ohlcv-1h",
223 Self::Ohlcv1D => "ohlcv-1d",
224 Self::OhlcvEod => "ohlcv-eod",
225 Self::Status => "status",
226 Self::InstrumentDef => "instrument-def",
227 Self::Imbalance => "imbalance",
228 Self::Error => "error",
229 Self::SymbolMapping => "symbol-mapping",
230 Self::System => "system",
231 Self::Statistics => "statistics",
232 Self::Mbo => "mbo",
233 Self::Cmbp1 => "cmbp-1",
234 Self::Cbbo1S => "cbbo-1s",
235 Self::Cbbo1M => "cbbo-1m",
236 Self::Tcbbo => "tcbbo",
237 Self::Bbo1S => "bbo-1s",
238 Self::Bbo1M => "bbo-1m",
239 }
240 }
241}
242
243impl Display for RType {
244 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
245 f.write_str(self.as_str())
246 }
247}
248
249#[derive(
253 Debug,
254 Clone,
255 Copy,
256 Default,
257 PartialEq,
258 Eq,
259 PartialOrd,
260 Ord,
261 Hash,
262 TryFromPrimitive,
263 IntoPrimitive,
264)]
265#[cfg_attr(
266 feature = "python",
267 derive(strum::EnumIter),
268 pyo3::pyclass(from_py_object, module = "databento_dbn")
269)]
270#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
271#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
272#[repr(u8)]
273pub enum Side {
274 #[pyo3(name = "ASK")]
276 Ask = b'A',
277 #[pyo3(name = "BID")]
279 Bid = b'B',
280 #[default]
282 #[pyo3(name = "NONE")]
283 None = b'N',
284}
285
286impl From<Side> for char {
287 fn from(value: Side) -> Self {
288 u8::from(value) as char
289 }
290}
291
292#[derive(
298 Debug,
299 Clone,
300 Copy,
301 Default,
302 PartialEq,
303 Eq,
304 PartialOrd,
305 Ord,
306 Hash,
307 TryFromPrimitive,
308 IntoPrimitive,
309)]
310#[cfg_attr(
311 feature = "python",
312 derive(strum::EnumIter),
313 pyo3::pyclass(from_py_object, module = "databento_dbn")
314)]
315#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
316#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
317#[repr(u8)]
318pub enum Action {
319 #[pyo3(name = "MODIFY")]
321 Modify = b'M',
322 #[pyo3(name = "TRADE")]
324 Trade = b'T',
325 #[pyo3(name = "FILL")]
327 Fill = b'F',
328 #[pyo3(name = "CANCEL")]
330 Cancel = b'C',
331 #[pyo3(name = "ADD")]
333 Add = b'A',
334 #[pyo3(name = "CLEAR")]
336 Clear = b'R',
337 #[default]
339 #[pyo3(name = "NONE")]
340 None = b'N',
341}
342
343impl From<Action> for char {
344 fn from(value: Action) -> Self {
345 u8::from(value) as char
346 }
347}
348
349#[derive(
354 Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, TryFromPrimitive, IntoPrimitive,
355)]
356#[cfg_attr(
357 feature = "python",
358 derive(strum::EnumIter),
359 pyo3::pyclass(from_py_object, module = "databento_dbn")
360)]
361#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
362#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
363#[non_exhaustive]
364#[repr(u8)]
365pub enum InstrumentClass {
366 #[pyo3(name = "BOND")]
368 Bond = b'B',
369 #[pyo3(name = "CALL")]
371 Call = b'C',
372 #[pyo3(name = "FUTURE")]
374 Future = b'F',
375 #[pyo3(name = "INDEX")]
377 Index = b'I',
378 #[pyo3(name = "STOCK")]
380 Stock = b'K',
381 #[pyo3(name = "MIXED_SPREAD")]
383 MixedSpread = b'M',
384 #[pyo3(name = "PUT")]
386 Put = b'P',
387 #[pyo3(name = "FUTURE_SPREAD")]
389 FutureSpread = b'S',
390 #[pyo3(name = "OPTION_SPREAD")]
392 OptionSpread = b'T',
393 #[pyo3(name = "FX_SPOT")]
395 FxSpot = b'X',
396 #[pyo3(name = "COMMODITY_SPOT")]
398 CommoditySpot = b'Y',
399}
400
401impl From<InstrumentClass> for char {
402 fn from(value: InstrumentClass) -> Self {
403 u8::from(value) as char
404 }
405}
406
407#[derive(
409 Debug,
410 Clone,
411 Copy,
412 Default,
413 PartialEq,
414 Eq,
415 PartialOrd,
416 Ord,
417 Hash,
418 TryFromPrimitive,
419 IntoPrimitive,
420)]
421#[cfg_attr(
422 feature = "python",
423 derive(strum::EnumIter),
424 pyo3::pyclass(from_py_object, module = "databento_dbn")
425)]
426#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
427#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
428#[repr(u8)]
429pub enum MatchAlgorithm {
430 #[default]
432 #[pyo3(name = "UNDEFINED")]
433 Undefined = b' ',
434 #[pyo3(name = "FIFO")]
436 Fifo = b'F',
437 #[pyo3(name = "CONFIGURABLE")]
439 Configurable = b'K',
440 #[pyo3(name = "PRO_RATA")]
443 ProRata = b'C',
444 #[pyo3(name = "FIFO_LMM")]
446 FifoLmm = b'T',
447 #[pyo3(name = "THRESHOLD_PRO_RATA")]
450 ThresholdProRata = b'O',
451 #[pyo3(name = "FIFO_TOP_LMM")]
454 FifoTopLmm = b'S',
455 #[pyo3(name = "THRESHOLD_PRO_RATA_LMM")]
457 ThresholdProRataLmm = b'Q',
458 #[pyo3(name = "EURODOLLAR_FUTURES")]
460 EurodollarFutures = b'Y',
461 #[pyo3(name = "TIME_PRO_RATA")]
464 TimeProRata = b'P',
465 #[pyo3(name = "INSTITUTIONAL_PRIORITIZATION")]
469 InstitutionalPrioritization = b'V',
470}
471
472impl From<MatchAlgorithm> for char {
473 fn from(value: MatchAlgorithm) -> Self {
474 u8::from(value) as char
475 }
476}
477
478#[derive(
483 Debug,
484 Clone,
485 Copy,
486 Default,
487 PartialEq,
488 Eq,
489 PartialOrd,
490 Ord,
491 Hash,
492 TryFromPrimitive,
493 IntoPrimitive,
494)]
495#[cfg_attr(
496 feature = "python",
497 derive(strum::EnumIter),
498 pyo3::pyclass(from_py_object, module = "databento_dbn")
499)]
500#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
501#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
502#[repr(u8)]
503pub enum UserDefinedInstrument {
504 #[default]
506 #[pyo3(name = "NO")]
507 No = b'N',
508 #[pyo3(name = "YES")]
510 Yes = b'Y',
511}
512
513impl From<UserDefinedInstrument> for char {
514 fn from(value: UserDefinedInstrument) -> Self {
515 u8::from(value) as char
516 }
517}
518
519#[derive(
521 Debug,
522 Clone,
523 Copy,
524 Default,
525 PartialEq,
526 Eq,
527 PartialOrd,
528 Ord,
529 Hash,
530 TryFromPrimitive,
531 IntoPrimitive,
532)]
533#[cfg_attr(
534 feature = "python",
535 derive(strum::EnumIter),
536 pyo3::pyclass(from_py_object, module = "databento_dbn")
537)]
538#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
539#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
540#[repr(u8)]
541pub enum SecurityUpdateAction {
542 #[default]
544 #[pyo3(name = "ADD")]
545 Add = b'A',
546 #[pyo3(name = "MODIFY")]
548 Modify = b'M',
549 #[pyo3(name = "DELETE")]
551 Delete = b'D',
552 #[doc(hidden)]
553 #[deprecated(since = "0.3.0", note = "Still present in legacy files.")]
554 #[pyo3(name = "INVALID")]
555 Invalid = b'~',
556}
557
558impl From<SecurityUpdateAction> for char {
559 fn from(value: SecurityUpdateAction) -> Self {
560 u8::from(value) as char
561 }
562}
563
564#[derive(
568 Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, TryFromPrimitive, IntoPrimitive,
569)]
570#[cfg_attr(
571 feature = "python",
572 derive(strum::EnumIter),
573 pyo3::pyclass(from_py_object, module = "databento_dbn")
574)]
575#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
576#[repr(u8)]
577pub enum SType {
578 #[pyo3(name = "INSTRUMENT_ID")]
580 InstrumentId = 0,
581 #[pyo3(name = "RAW_SYMBOL")]
583 RawSymbol = 1,
584 #[deprecated(since = "0.5.0", note = "Smart was split into continuous and parent.")]
586 #[pyo3(name = "SMART")]
587 Smart = 2,
588 #[pyo3(name = "CONTINUOUS")]
592 Continuous = 3,
593 #[pyo3(name = "PARENT")]
596 Parent = 4,
597 #[pyo3(name = "NASDAQ_SYMBOL")]
599 NasdaqSymbol = 5,
600 #[pyo3(name = "CMS_SYMBOL")]
602 CmsSymbol = 6,
603 #[pyo3(name = "ISIN")]
605 Isin = 7,
606 #[pyo3(name = "US_CODE")]
608 UsCode = 8,
609 #[pyo3(name = "BBG_COMP_ID")]
611 BbgCompId = 9,
612 #[pyo3(name = "BBG_COMP_TICKER")]
614 BbgCompTicker = 10,
615 #[pyo3(name = "FIGI")]
617 Figi = 11,
618 #[pyo3(name = "FIGI_TICKER")]
620 FigiTicker = 12,
621}
622
623impl std::str::FromStr for SType {
624 type Err = crate::Error;
625
626 fn from_str(s: &str) -> Result<Self, Self::Err> {
627 match s {
628 "instrument_id" | "product_id" => Ok(Self::InstrumentId),
629 "raw_symbol" | "native" => Ok(Self::RawSymbol),
630 #[allow(deprecated)]
631 "smart" => Ok(Self::Smart),
632 "continuous" => Ok(Self::Continuous),
633 "parent" => Ok(Self::Parent),
634 "nasdaq_symbol" | "nasdaq" => Ok(Self::NasdaqSymbol),
635 "cms_symbol" | "cms" => Ok(Self::CmsSymbol),
636 "isin" => Ok(Self::Isin),
637 "us_code" => Ok(Self::UsCode),
638 "bbg_comp_id" => Ok(Self::BbgCompId),
639 "bbg_comp_ticker" => Ok(Self::BbgCompTicker),
640 "figi" => Ok(Self::Figi),
641 "figi_ticker" => Ok(Self::FigiTicker),
642 _ => Err(crate::Error::conversion::<Self>(s.to_owned())),
643 }
644 }
645}
646
647impl AsRef<str> for SType {
648 fn as_ref(&self) -> &str {
649 self.as_str()
650 }
651}
652
653impl SType {
654 pub const fn as_str(&self) -> &'static str {
656 match self {
657 Self::InstrumentId => "instrument_id",
658 Self::RawSymbol => "raw_symbol",
659 #[allow(deprecated)]
660 Self::Smart => "smart",
661 Self::Continuous => "continuous",
662 Self::Parent => "parent",
663 Self::NasdaqSymbol => "nasdaq_symbol",
664 Self::CmsSymbol => "cms_symbol",
665 Self::Isin => "isin",
666 Self::UsCode => "us_code",
667 Self::BbgCompId => "bbg_comp_id",
668 Self::BbgCompTicker => "bbg_comp_ticker",
669 Self::Figi => "figi",
670 Self::FigiTicker => "figi_ticker",
671 }
672 }
673}
674
675impl Display for SType {
676 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
677 f.write_str(self.as_str())
678 }
679}
680
681#[derive(
688 Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, TryFromPrimitive, IntoPrimitive,
689)]
690#[cfg_attr(
691 feature = "python",
692 derive(strum::EnumIter),
693 pyo3::pyclass(from_py_object, module = "databento_dbn")
694)]
695#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
696#[repr(u16)]
697pub enum Schema {
698 #[pyo3(name = "MBO")]
700 Mbo = 0,
701 #[pyo3(name = "MBP_1")]
703 Mbp1 = 1,
704 #[pyo3(name = "MBP_10")]
706 Mbp10 = 2,
707 #[pyo3(name = "TBBO")]
710 Tbbo = 3,
711 #[pyo3(name = "TRADES")]
713 Trades = 4,
714 #[pyo3(name = "OHLCV_1S")]
716 Ohlcv1S = 5,
717 #[pyo3(name = "OHLCV_1M")]
719 Ohlcv1M = 6,
720 #[pyo3(name = "OHLCV_1H")]
722 Ohlcv1H = 7,
723 #[pyo3(name = "OHLCV_1D")]
725 Ohlcv1D = 8,
726 #[pyo3(name = "DEFINITION")]
728 Definition = 9,
729 #[pyo3(name = "STATISTICS")]
731 Statistics = 10,
732 #[pyo3(name = "STATUS")]
734 Status = 11,
735 #[pyo3(name = "IMBALANCE")]
737 Imbalance = 12,
738 #[pyo3(name = "OHLCV_EOD")]
741 OhlcvEod = 13,
742 #[pyo3(name = "CMBP_1")]
744 Cmbp1 = 14,
745 #[pyo3(name = "CBBO_1S")]
748 Cbbo1S = 15,
749 #[pyo3(name = "CBBO_1M")]
752 Cbbo1M = 16,
753 #[pyo3(name = "TCBBO")]
756 Tcbbo = 17,
757 #[pyo3(name = "BBO_1S")]
759 Bbo1S = 18,
760 #[pyo3(name = "BBO_1M")]
762 Bbo1M = 19,
763}
764
765impl std::str::FromStr for Schema {
766 type Err = crate::Error;
767
768 fn from_str(s: &str) -> Result<Self, Self::Err> {
769 match s {
770 "mbo" => Ok(Self::Mbo),
771 "mbp-1" => Ok(Self::Mbp1),
772 "mbp-10" => Ok(Self::Mbp10),
773 "tbbo" => Ok(Self::Tbbo),
774 "trades" => Ok(Self::Trades),
775 "ohlcv-1s" => Ok(Self::Ohlcv1S),
776 "ohlcv-1m" => Ok(Self::Ohlcv1M),
777 "ohlcv-1h" => Ok(Self::Ohlcv1H),
778 "ohlcv-1d" => Ok(Self::Ohlcv1D),
779 "definition" => Ok(Self::Definition),
780 "statistics" => Ok(Self::Statistics),
781 "status" => Ok(Self::Status),
782 "imbalance" => Ok(Self::Imbalance),
783 "ohlcv-eod" => Ok(Self::OhlcvEod),
784 "cmbp-1" => Ok(Self::Cmbp1),
785 "cbbo-1s" => Ok(Self::Cbbo1S),
786 "cbbo-1m" => Ok(Self::Cbbo1M),
787 "tcbbo" => Ok(Self::Tcbbo),
788 "bbo-1s" => Ok(Self::Bbo1S),
789 "bbo-1m" => Ok(Self::Bbo1M),
790 _ => Err(crate::Error::conversion::<Self>(s.to_owned())),
791 }
792 }
793}
794
795impl AsRef<str> for Schema {
796 fn as_ref(&self) -> &str {
797 self.as_str()
798 }
799}
800
801impl Schema {
802 pub const fn as_str(&self) -> &'static str {
804 match self {
805 Self::Mbo => "mbo",
806 Self::Mbp1 => "mbp-1",
807 Self::Mbp10 => "mbp-10",
808 Self::Tbbo => "tbbo",
809 Self::Trades => "trades",
810 Self::Ohlcv1S => "ohlcv-1s",
811 Self::Ohlcv1M => "ohlcv-1m",
812 Self::Ohlcv1H => "ohlcv-1h",
813 Self::Ohlcv1D => "ohlcv-1d",
814 Self::Definition => "definition",
815 Self::Statistics => "statistics",
816 Self::Status => "status",
817 Self::Imbalance => "imbalance",
818 Self::OhlcvEod => "ohlcv-eod",
819 Self::Cmbp1 => "cmbp-1",
820 Self::Cbbo1S => "cbbo-1s",
821 Self::Cbbo1M => "cbbo-1m",
822 Self::Tcbbo => "tcbbo",
823 Self::Bbo1S => "bbo-1s",
824 Self::Bbo1M => "bbo-1m",
825 }
826 }
827
828 pub const COUNT: usize = 20;
830}
831
832impl Display for Schema {
833 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
834 f.write_str(self.as_str())
835 }
836}
837
838#[derive(
840 Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, TryFromPrimitive, IntoPrimitive,
841)]
842#[cfg_attr(
843 feature = "python",
844 derive(strum::EnumIter),
845 pyo3::pyclass(from_py_object, module = "databento_dbn")
846)]
847#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
848#[repr(u8)]
849pub enum Encoding {
850 #[pyo3(name = "DBN")]
852 Dbn = 0,
853 #[pyo3(name = "CSV")]
855 Csv = 1,
856 #[pyo3(name = "JSON")]
858 Json = 2,
859}
860
861impl std::str::FromStr for Encoding {
862 type Err = crate::Error;
863
864 fn from_str(s: &str) -> Result<Self, Self::Err> {
865 match s {
866 "dbn" | "dbz" => Ok(Self::Dbn),
867 "csv" => Ok(Self::Csv),
868 "json" => Ok(Self::Json),
869 _ => Err(crate::Error::conversion::<Self>(s.to_owned())),
870 }
871 }
872}
873
874impl AsRef<str> for Encoding {
875 fn as_ref(&self) -> &str {
876 self.as_str()
877 }
878}
879
880impl Encoding {
881 pub const fn as_str(&self) -> &'static str {
883 match self {
884 Self::Dbn => "dbn",
885 Self::Csv => "csv",
886 Self::Json => "json",
887 }
888 }
889}
890
891impl Display for Encoding {
892 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
893 f.write_str(self.as_str())
894 }
895}
896
897#[derive(
899 Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, TryFromPrimitive, IntoPrimitive,
900)]
901#[cfg_attr(
902 feature = "python",
903 derive(strum::EnumIter),
904 pyo3::pyclass(from_py_object, module = "databento_dbn")
905)]
906#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
907#[repr(u8)]
908pub enum Compression {
909 #[pyo3(name = "NONE")]
911 None = 0,
912 #[pyo3(name = "ZSTD")]
914 Zstd = 1,
915}
916
917impl std::str::FromStr for Compression {
918 type Err = crate::Error;
919
920 fn from_str(s: &str) -> Result<Self, Self::Err> {
921 match s {
922 "none" => Ok(Self::None),
923 "zstd" => Ok(Self::Zstd),
924 _ => Err(crate::Error::conversion::<Self>(s.to_owned())),
925 }
926 }
927}
928
929impl AsRef<str> for Compression {
930 fn as_ref(&self) -> &str {
931 self.as_str()
932 }
933}
934
935impl Compression {
936 pub const fn as_str(&self) -> &'static str {
938 match self {
939 Self::None => "none",
940 Self::Zstd => "zstd",
941 }
942 }
943}
944
945impl Display for Compression {
946 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
947 f.write_str(self.as_str())
948 }
949}
950
951#[derive(
953 Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, TryFromPrimitive, IntoPrimitive,
954)]
955#[cfg_attr(
956 feature = "python",
957 derive(strum::EnumIter),
958 pyo3::pyclass(from_py_object, module = "databento_dbn")
959)]
960#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
961#[non_exhaustive]
962#[repr(u16)]
963pub enum StatType {
964 #[pyo3(name = "OPENING_PRICE")]
967 OpeningPrice = 1,
968 #[pyo3(name = "INDICATIVE_OPENING_PRICE")]
971 IndicativeOpeningPrice = 2,
972 #[pyo3(name = "SETTLEMENT_PRICE")]
976 SettlementPrice = 3,
977 #[pyo3(name = "TRADING_SESSION_LOW_PRICE")]
980 TradingSessionLowPrice = 4,
981 #[pyo3(name = "TRADING_SESSION_HIGH_PRICE")]
984 TradingSessionHighPrice = 5,
985 #[pyo3(name = "CLEARED_VOLUME")]
988 ClearedVolume = 6,
989 #[pyo3(name = "LOWEST_OFFER")]
992 LowestOffer = 7,
993 #[pyo3(name = "HIGHEST_BID")]
996 HighestBid = 8,
997 #[pyo3(name = "OPEN_INTEREST")]
1001 OpenInterest = 9,
1002 #[pyo3(name = "FIXING_PRICE")]
1005 FixingPrice = 10,
1006 #[pyo3(name = "CLOSE_PRICE")]
1009 ClosePrice = 11,
1010 #[pyo3(name = "NET_CHANGE")]
1013 NetChange = 12,
1014 #[pyo3(name = "VWAP")]
1018 Vwap = 13,
1019 #[pyo3(name = "VOLATILITY")]
1022 Volatility = 14,
1023 #[pyo3(name = "DELTA")]
1026 Delta = 15,
1027 #[pyo3(name = "UNCROSSING_PRICE")]
1031 UncrossingPrice = 16,
1032 #[pyo3(name = "UPPER_PRICE_LIMIT")]
1034 UpperPriceLimit = 17,
1035 #[pyo3(name = "LOWER_PRICE_LIMIT")]
1037 LowerPriceLimit = 18,
1038 #[pyo3(name = "BLOCK_VOLUME")]
1041 BlockVolume = 19,
1042 #[pyo3(name = "INDICATIVE_CLOSE_PRICE")]
1045 IndicativeClosePrice = 20,
1046 #[pyo3(name = "VENUE_SPECIFIC_VOLUME_1")]
1049 VenueSpecificVolume1 = 10001,
1050 #[pyo3(name = "VENUE_SPECIFIC_PRICE_1")]
1053 VenueSpecificPrice1 = 10002,
1054}
1055
1056#[derive(
1058 Debug,
1059 Clone,
1060 Copy,
1061 Default,
1062 PartialEq,
1063 Eq,
1064 PartialOrd,
1065 Ord,
1066 Hash,
1067 TryFromPrimitive,
1068 IntoPrimitive,
1069)]
1070#[cfg_attr(
1071 feature = "python",
1072 derive(strum::EnumIter),
1073 pyo3::pyclass(from_py_object, module = "databento_dbn")
1074)]
1075#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
1076#[non_exhaustive]
1077#[repr(u8)]
1078pub enum StatUpdateAction {
1079 #[default]
1081 #[pyo3(name = "NEW")]
1082 New = 1,
1083 #[pyo3(name = "DELETE")]
1085 Delete = 2,
1086}
1087
1088#[derive(
1090 Debug,
1091 Clone,
1092 Copy,
1093 Default,
1094 PartialEq,
1095 Eq,
1096 PartialOrd,
1097 Ord,
1098 Hash,
1099 TryFromPrimitive,
1100 IntoPrimitive,
1101)]
1102#[cfg_attr(
1103 feature = "python",
1104 derive(strum::EnumIter),
1105 pyo3::pyclass(from_py_object, module = "databento_dbn")
1106)]
1107#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
1108#[non_exhaustive]
1109#[repr(u16)]
1110pub enum StatusAction {
1111 #[default]
1113 #[pyo3(name = "NONE")]
1114 None = 0,
1115 #[pyo3(name = "PRE_OPEN")]
1117 PreOpen = 1,
1118 #[pyo3(name = "PRE_CROSS")]
1120 PreCross = 2,
1121 #[pyo3(name = "QUOTING")]
1123 Quoting = 3,
1124 #[pyo3(name = "CROSS")]
1126 Cross = 4,
1127 #[pyo3(name = "ROTATION")]
1129 Rotation = 5,
1130 #[pyo3(name = "NEW_PRICE_INDICATION")]
1132 NewPriceIndication = 6,
1133 #[pyo3(name = "TRADING")]
1135 Trading = 7,
1136 #[pyo3(name = "HALT")]
1138 Halt = 8,
1139 #[pyo3(name = "PAUSE")]
1141 Pause = 9,
1142 #[pyo3(name = "SUSPEND")]
1144 Suspend = 10,
1145 #[pyo3(name = "PRE_CLOSE")]
1147 PreClose = 11,
1148 #[pyo3(name = "CLOSE")]
1150 Close = 12,
1151 #[pyo3(name = "POST_CLOSE")]
1153 PostClose = 13,
1154 #[pyo3(name = "SSR_CHANGE")]
1156 SsrChange = 14,
1157 #[pyo3(name = "NOT_AVAILABLE_FOR_TRADING")]
1159 NotAvailableForTrading = 15,
1160}
1161
1162#[derive(
1165 Debug,
1166 Clone,
1167 Copy,
1168 Default,
1169 PartialEq,
1170 Eq,
1171 PartialOrd,
1172 Ord,
1173 Hash,
1174 TryFromPrimitive,
1175 IntoPrimitive,
1176)]
1177#[cfg_attr(
1178 feature = "python",
1179 derive(strum::EnumIter),
1180 pyo3::pyclass(from_py_object, module = "databento_dbn")
1181)]
1182#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
1183#[non_exhaustive]
1184#[repr(u16)]
1185pub enum StatusReason {
1186 #[default]
1188 #[pyo3(name = "NONE")]
1189 None = 0,
1190 #[pyo3(name = "SCHEDULED")]
1192 Scheduled = 1,
1193 #[pyo3(name = "SURVEILLANCE_INTERVENTION")]
1195 SurveillanceIntervention = 2,
1196 #[pyo3(name = "MARKET_EVENT")]
1198 MarketEvent = 3,
1199 #[pyo3(name = "INSTRUMENT_ACTIVATION")]
1201 InstrumentActivation = 4,
1202 #[pyo3(name = "INSTRUMENT_EXPIRATION")]
1204 InstrumentExpiration = 5,
1205 #[pyo3(name = "RECOVERY_IN_PROCESS")]
1207 RecoveryInProcess = 6,
1208 #[pyo3(name = "REGULATORY")]
1210 Regulatory = 10,
1211 #[pyo3(name = "ADMINISTRATIVE")]
1213 Administrative = 11,
1214 #[pyo3(name = "NON_COMPLIANCE")]
1217 NonCompliance = 12,
1218 #[pyo3(name = "FILINGS_NOT_CURRENT")]
1220 FilingsNotCurrent = 13,
1221 #[pyo3(name = "SEC_TRADING_SUSPENSION")]
1223 SecTradingSuspension = 14,
1224 #[pyo3(name = "NEW_ISSUE")]
1226 NewIssue = 15,
1227 #[pyo3(name = "ISSUE_AVAILABLE")]
1229 IssueAvailable = 16,
1230 #[pyo3(name = "ISSUES_REVIEWED")]
1232 IssuesReviewed = 17,
1233 #[pyo3(name = "FILING_REQS_SATISFIED")]
1235 FilingReqsSatisfied = 18,
1236 #[pyo3(name = "NEWS_PENDING")]
1238 NewsPending = 30,
1239 #[pyo3(name = "NEWS_RELEASED")]
1241 NewsReleased = 31,
1242 #[pyo3(name = "NEWS_AND_RESUMPTION_TIMES")]
1245 NewsAndResumptionTimes = 32,
1246 #[pyo3(name = "NEWS_NOT_FORTHCOMING")]
1248 NewsNotForthcoming = 33,
1249 #[pyo3(name = "ORDER_IMBALANCE")]
1251 OrderImbalance = 40,
1252 #[pyo3(name = "LULD_PAUSE")]
1254 LuldPause = 50,
1255 #[pyo3(name = "OPERATIONAL")]
1257 Operational = 60,
1258 #[pyo3(name = "ADDITIONAL_INFORMATION_REQUESTED")]
1260 AdditionalInformationRequested = 70,
1261 #[pyo3(name = "MERGER_EFFECTIVE")]
1263 MergerEffective = 80,
1264 #[pyo3(name = "ETF")]
1266 Etf = 90,
1267 #[pyo3(name = "CORPORATE_ACTION")]
1269 CorporateAction = 100,
1270 #[pyo3(name = "NEW_SECURITY_OFFERING")]
1272 NewSecurityOffering = 110,
1273 #[pyo3(name = "MARKET_WIDE_HALT_LEVEL1")]
1275 MarketWideHaltLevel1 = 120,
1276 #[pyo3(name = "MARKET_WIDE_HALT_LEVEL2")]
1278 MarketWideHaltLevel2 = 121,
1279 #[pyo3(name = "MARKET_WIDE_HALT_LEVEL3")]
1281 MarketWideHaltLevel3 = 122,
1282 #[pyo3(name = "MARKET_WIDE_HALT_CARRYOVER")]
1285 MarketWideHaltCarryover = 123,
1286 #[pyo3(name = "MARKET_WIDE_HALT_RESUMPTION")]
1288 MarketWideHaltResumption = 124,
1289 #[pyo3(name = "QUOTATION_NOT_AVAILABLE")]
1291 QuotationNotAvailable = 130,
1292}
1293
1294#[derive(
1296 Debug,
1297 Clone,
1298 Copy,
1299 Default,
1300 PartialEq,
1301 Eq,
1302 PartialOrd,
1303 Ord,
1304 Hash,
1305 TryFromPrimitive,
1306 IntoPrimitive,
1307)]
1308#[cfg_attr(
1309 feature = "python",
1310 derive(strum::EnumIter),
1311 pyo3::pyclass(from_py_object, module = "databento_dbn")
1312)]
1313#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
1314#[non_exhaustive]
1315#[repr(u16)]
1316pub enum TradingEvent {
1317 #[default]
1319 #[pyo3(name = "NONE")]
1320 None = 0,
1321 #[pyo3(name = "NO_CANCEL")]
1323 NoCancel = 1,
1324 #[pyo3(name = "CHANGE_TRADING_SESSION")]
1326 ChangeTradingSession = 2,
1327 #[pyo3(name = "IMPLIED_MATCHING_ON")]
1329 ImpliedMatchingOn = 3,
1330 #[pyo3(name = "IMPLIED_MATCHING_OFF")]
1332 ImpliedMatchingOff = 4,
1333}
1334
1335#[derive(
1338 Debug,
1339 Clone,
1340 Copy,
1341 Default,
1342 PartialEq,
1343 Eq,
1344 PartialOrd,
1345 Ord,
1346 Hash,
1347 TryFromPrimitive,
1348 IntoPrimitive,
1349)]
1350#[cfg_attr(
1351 feature = "python",
1352 derive(strum::EnumIter),
1353 pyo3::pyclass(from_py_object, module = "databento_dbn")
1354)]
1355#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
1356#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1357#[repr(u8)]
1358pub enum TriState {
1359 #[default]
1361 #[pyo3(name = "NOT_AVAILABLE")]
1362 NotAvailable = b'~',
1363 #[pyo3(name = "NO")]
1365 No = b'N',
1366 #[pyo3(name = "YES")]
1368 Yes = b'Y',
1369}
1370
1371impl From<TriState> for char {
1372 fn from(value: TriState) -> Self {
1373 u8::from(value) as char
1374 }
1375}
1376
1377#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
1379#[cfg_attr(
1380 feature = "python",
1381 derive(strum::EnumIter),
1382 pyo3::pyclass(from_py_object, module = "databento_dbn")
1383)]
1384#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
1385pub enum VersionUpgradePolicy {
1386 #[pyo3(name = "AS_IS")]
1389 AsIs,
1390 #[pyo3(name = "UPGRADE_TO_V2")]
1393 UpgradeToV2,
1394 #[default]
1398 #[pyo3(name = "UPGRADE_TO_V3")]
1399 UpgradeToV3,
1400}
1401
1402#[derive(
1404 Debug,
1405 Clone,
1406 Copy,
1407 Default,
1408 PartialEq,
1409 Eq,
1410 PartialOrd,
1411 Ord,
1412 Hash,
1413 TryFromPrimitive,
1414 IntoPrimitive,
1415)]
1416#[cfg_attr(
1417 feature = "python",
1418 derive(strum::EnumIter),
1419 pyo3::pyclass(from_py_object, module = "databento_dbn")
1420)]
1421#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
1422#[non_exhaustive]
1423#[repr(u8)]
1424pub enum ErrorCode {
1425 #[pyo3(name = "AUTH_FAILED")]
1427 AuthFailed = 1,
1428 #[pyo3(name = "API_KEY_DEACTIVATED")]
1430 ApiKeyDeactivated = 2,
1431 #[pyo3(name = "CONNECTION_LIMIT_EXCEEDED")]
1433 ConnectionLimitExceeded = 3,
1434 #[pyo3(name = "SYMBOL_RESOLUTION_FAILED")]
1436 SymbolResolutionFailed = 4,
1437 #[pyo3(name = "INVALID_SUBSCRIPTION")]
1439 InvalidSubscription = 5,
1440 #[pyo3(name = "INTERNAL_ERROR")]
1442 InternalError = 6,
1443 #[pyo3(name = "SKIPPED_RECORDS_AFTER_SLOW_READING")]
1445 SkippedRecordsAfterSlowReading = 7,
1446 #[default]
1448 #[pyo3(name = "UNSET")]
1449 Unset = 255,
1450}
1451
1452impl std::str::FromStr for ErrorCode {
1453 type Err = crate::Error;
1454
1455 fn from_str(s: &str) -> Result<Self, Self::Err> {
1456 match s {
1457 "auth_failed" => Ok(Self::AuthFailed),
1458 "api_key_deactivated" => Ok(Self::ApiKeyDeactivated),
1459 "connection_limit_exceeded" => Ok(Self::ConnectionLimitExceeded),
1460 "symbol_resolution_failed" => Ok(Self::SymbolResolutionFailed),
1461 "invalid_subscription" => Ok(Self::InvalidSubscription),
1462 "internal_error" => Ok(Self::InternalError),
1463 "skipped_records_after_slow_reading" => Ok(Self::SkippedRecordsAfterSlowReading),
1464 "unset" => Ok(Self::Unset),
1465 _ => Err(crate::Error::conversion::<Self>(s.to_owned())),
1466 }
1467 }
1468}
1469
1470impl AsRef<str> for ErrorCode {
1471 fn as_ref(&self) -> &str {
1472 self.as_str()
1473 }
1474}
1475
1476impl ErrorCode {
1477 pub const fn as_str(&self) -> &'static str {
1479 match self {
1480 Self::AuthFailed => "auth_failed",
1481 Self::ApiKeyDeactivated => "api_key_deactivated",
1482 Self::ConnectionLimitExceeded => "connection_limit_exceeded",
1483 Self::SymbolResolutionFailed => "symbol_resolution_failed",
1484 Self::InvalidSubscription => "invalid_subscription",
1485 Self::InternalError => "internal_error",
1486 Self::SkippedRecordsAfterSlowReading => "skipped_records_after_slow_reading",
1487 Self::Unset => "unset",
1488 }
1489 }
1490}
1491
1492impl Display for ErrorCode {
1493 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
1494 f.write_str(self.as_str())
1495 }
1496}
1497
1498#[derive(
1501 Debug,
1502 Clone,
1503 Copy,
1504 Default,
1505 PartialEq,
1506 Eq,
1507 PartialOrd,
1508 Ord,
1509 Hash,
1510 TryFromPrimitive,
1511 IntoPrimitive,
1512)]
1513#[cfg_attr(
1514 feature = "python",
1515 derive(strum::EnumIter),
1516 pyo3::pyclass(from_py_object, module = "databento_dbn")
1517)]
1518#[cfg_attr(not(feature = "python"), derive(MockPyo3))]
1519#[non_exhaustive]
1520#[repr(u8)]
1521pub enum SystemCode {
1522 #[pyo3(name = "HEARTBEAT")]
1525 Heartbeat = 0,
1526 #[pyo3(name = "SUBSCRIPTION_ACK")]
1528 SubscriptionAck = 1,
1529 #[pyo3(name = "SLOW_READER_WARNING")]
1531 SlowReaderWarning = 2,
1532 #[pyo3(name = "REPLAY_COMPLETED")]
1534 ReplayCompleted = 3,
1535 #[pyo3(name = "END_OF_INTERVAL")]
1537 EndOfInterval = 4,
1538 #[default]
1541 #[pyo3(name = "UNSET")]
1542 Unset = 255,
1543}
1544
1545impl std::str::FromStr for SystemCode {
1546 type Err = crate::Error;
1547
1548 fn from_str(s: &str) -> Result<Self, Self::Err> {
1549 match s {
1550 "heartbeat" => Ok(Self::Heartbeat),
1551 "subscription_ack" => Ok(Self::SubscriptionAck),
1552 "slow_reader_warning" => Ok(Self::SlowReaderWarning),
1553 "replay_completed" => Ok(Self::ReplayCompleted),
1554 "end_of_interval" => Ok(Self::EndOfInterval),
1555 "unset" => Ok(Self::Unset),
1556 _ => Err(crate::Error::conversion::<Self>(s.to_owned())),
1557 }
1558 }
1559}
1560
1561impl AsRef<str> for SystemCode {
1562 fn as_ref(&self) -> &str {
1563 self.as_str()
1564 }
1565}
1566
1567impl SystemCode {
1568 pub const fn as_str(&self) -> &'static str {
1570 match self {
1571 Self::Heartbeat => "heartbeat",
1572 Self::SubscriptionAck => "subscription_ack",
1573 Self::SlowReaderWarning => "slow_reader_warning",
1574 Self::ReplayCompleted => "replay_completed",
1575 Self::EndOfInterval => "end_of_interval",
1576 Self::Unset => "unset",
1577 }
1578 }
1579}
1580
1581impl Display for SystemCode {
1582 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
1583 f.write_str(self.as_str())
1584 }
1585}
1586
1587#[cfg(feature = "serde")]
1588mod deserialize {
1589 use std::str::FromStr;
1590
1591 use serde::{de, Deserialize, Deserializer, Serialize};
1592
1593 use super::*;
1594
1595 impl<'de> Deserialize<'de> for RType {
1596 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1597 let str = String::deserialize(deserializer)?;
1598 FromStr::from_str(&str).map_err(de::Error::custom)
1599 }
1600 }
1601
1602 impl Serialize for RType {
1603 fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
1604 where
1605 S: serde::Serializer,
1606 {
1607 self.as_str().serialize(serializer)
1608 }
1609 }
1610
1611 impl<'de> Deserialize<'de> for SType {
1612 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1613 let str = String::deserialize(deserializer)?;
1614 FromStr::from_str(&str).map_err(de::Error::custom)
1615 }
1616 }
1617
1618 impl Serialize for SType {
1619 fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
1620 where
1621 S: serde::Serializer,
1622 {
1623 self.as_str().serialize(serializer)
1624 }
1625 }
1626
1627 impl<'de> Deserialize<'de> for Schema {
1628 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1629 let str = String::deserialize(deserializer)?;
1630 FromStr::from_str(&str).map_err(de::Error::custom)
1631 }
1632 }
1633
1634 impl Serialize for Schema {
1635 fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
1636 where
1637 S: serde::Serializer,
1638 {
1639 self.as_str().serialize(serializer)
1640 }
1641 }
1642
1643 impl<'de> Deserialize<'de> for Encoding {
1644 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1645 let str = String::deserialize(deserializer)?;
1646 FromStr::from_str(&str).map_err(de::Error::custom)
1647 }
1648 }
1649
1650 impl Serialize for Encoding {
1651 fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
1652 where
1653 S: serde::Serializer,
1654 {
1655 self.as_str().serialize(serializer)
1656 }
1657 }
1658
1659 impl<'de> Deserialize<'de> for Compression {
1660 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1661 let str = String::deserialize(deserializer)?;
1662 FromStr::from_str(&str).map_err(de::Error::custom)
1663 }
1664 }
1665
1666 impl Serialize for Compression {
1667 fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
1668 where
1669 S: serde::Serializer,
1670 {
1671 self.as_str().serialize(serializer)
1672 }
1673 }
1674
1675 impl<'de> Deserialize<'de> for ErrorCode {
1676 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1677 let str = String::deserialize(deserializer)?;
1678 FromStr::from_str(&str).map_err(de::Error::custom)
1679 }
1680 }
1681
1682 impl Serialize for ErrorCode {
1683 fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
1684 where
1685 S: serde::Serializer,
1686 {
1687 self.as_str().serialize(serializer)
1688 }
1689 }
1690
1691 impl<'de> Deserialize<'de> for SystemCode {
1692 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1693 let str = String::deserialize(deserializer)?;
1694 FromStr::from_str(&str).map_err(de::Error::custom)
1695 }
1696 }
1697
1698 impl Serialize for SystemCode {
1699 fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
1700 where
1701 S: serde::Serializer,
1702 {
1703 self.as_str().serialize(serializer)
1704 }
1705 }
1706}