dbn/
publishers.rs

1//! Enumerations for different data sources, venues, and publishers.
2
3use std::fmt::{self, Display, Formatter};
4
5use num_enum::{IntoPrimitive, TryFromPrimitive};
6
7use crate::{Error, Result};
8
9/// A trading execution venue.
10#[derive(
11    Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, IntoPrimitive, TryFromPrimitive,
12)]
13#[non_exhaustive]
14#[repr(u16)]
15pub enum Venue {
16    /// CME Globex
17    Glbx = 1,
18    /// Nasdaq - All Markets
19    Xnas = 2,
20    /// Nasdaq OMX BX
21    Xbos = 3,
22    /// Nasdaq OMX PSX
23    Xpsx = 4,
24    /// Cboe BZX U.S. Equities Exchange
25    Bats = 5,
26    /// Cboe BYX U.S. Equities Exchange
27    Baty = 6,
28    /// Cboe EDGA U.S. Equities Exchange
29    Edga = 7,
30    /// Cboe EDGX U.S. Equities Exchange
31    Edgx = 8,
32    /// New York Stock Exchange, Inc.
33    Xnys = 9,
34    /// NYSE National, Inc.
35    Xcis = 10,
36    /// NYSE MKT LLC
37    Xase = 11,
38    /// NYSE Arca
39    Arcx = 12,
40    /// NYSE Texas, Inc.
41    Xchi = 13,
42    /// Investors Exchange
43    Iexg = 14,
44    /// FINRA/Nasdaq TRF Carteret
45    Finn = 15,
46    /// FINRA/Nasdaq TRF Chicago
47    Finc = 16,
48    /// FINRA/NYSE TRF
49    Finy = 17,
50    /// MEMX LLC Equities
51    Memx = 18,
52    /// MIAX Pearl Equities
53    Eprl = 19,
54    /// NYSE American Options
55    Amxo = 20,
56    /// BOX Options
57    Xbox = 21,
58    /// Cboe Options
59    Xcbo = 22,
60    /// MIAX Emerald
61    Emld = 23,
62    /// Cboe EDGX Options
63    Edgo = 24,
64    /// Nasdaq GEMX
65    Gmni = 25,
66    /// Nasdaq ISE
67    Xisx = 26,
68    /// Nasdaq MRX
69    Mcry = 27,
70    /// MIAX Options
71    Xmio = 28,
72    /// NYSE Arca Options
73    Arco = 29,
74    /// Options Price Reporting Authority
75    Opra = 30,
76    /// MIAX Pearl
77    Mprl = 31,
78    /// Nasdaq Options
79    Xndq = 32,
80    /// Nasdaq BX Options
81    Xbxo = 33,
82    /// Cboe C2 Options
83    C2Ox = 34,
84    /// Nasdaq PHLX
85    Xphl = 35,
86    /// Cboe BZX Options
87    Bato = 36,
88    /// MEMX Options
89    Mxop = 37,
90    /// ICE Europe Commodities
91    Ifeu = 38,
92    /// ICE Endex
93    Ndex = 39,
94    /// Databento US Equities - Consolidated
95    Dbeq = 40,
96    /// MIAX Sapphire
97    Sphr = 41,
98    /// Long-Term Stock Exchange, Inc.
99    Ltse = 42,
100    /// Off-Exchange Transactions - Listed Instruments
101    Xoff = 43,
102    /// IntelligentCross ASPEN Intelligent Bid/Offer
103    Aspn = 44,
104    /// IntelligentCross ASPEN Maker/Taker
105    Asmt = 45,
106    /// IntelligentCross ASPEN Inverted
107    Aspi = 46,
108    /// Databento US Equities - Consolidated
109    Equs = 47,
110    /// ICE Futures US
111    Ifus = 48,
112    /// ICE Europe Financials
113    Ifll = 49,
114    /// Eurex Exchange
115    Xeur = 50,
116    /// European Energy Exchange
117    Xeee = 51,
118    /// Cboe Futures Exchange
119    Xcbf = 52,
120}
121
122/// The number of [`Venue`] variants.
123pub const VENUE_COUNT: usize = 52;
124
125impl Venue {
126    /// Converts the venue to its `str` representation.
127    pub const fn as_str(&self) -> &'static str {
128        match self {
129            Self::Glbx => "GLBX",
130            Self::Xnas => "XNAS",
131            Self::Xbos => "XBOS",
132            Self::Xpsx => "XPSX",
133            Self::Bats => "BATS",
134            Self::Baty => "BATY",
135            Self::Edga => "EDGA",
136            Self::Edgx => "EDGX",
137            Self::Xnys => "XNYS",
138            Self::Xcis => "XCIS",
139            Self::Xase => "XASE",
140            Self::Arcx => "ARCX",
141            Self::Xchi => "XCHI",
142            Self::Iexg => "IEXG",
143            Self::Finn => "FINN",
144            Self::Finc => "FINC",
145            Self::Finy => "FINY",
146            Self::Memx => "MEMX",
147            Self::Eprl => "EPRL",
148            Self::Amxo => "AMXO",
149            Self::Xbox => "XBOX",
150            Self::Xcbo => "XCBO",
151            Self::Emld => "EMLD",
152            Self::Edgo => "EDGO",
153            Self::Gmni => "GMNI",
154            Self::Xisx => "XISX",
155            Self::Mcry => "MCRY",
156            Self::Xmio => "XMIO",
157            Self::Arco => "ARCO",
158            Self::Opra => "OPRA",
159            Self::Mprl => "MPRL",
160            Self::Xndq => "XNDQ",
161            Self::Xbxo => "XBXO",
162            Self::C2Ox => "C2OX",
163            Self::Xphl => "XPHL",
164            Self::Bato => "BATO",
165            Self::Mxop => "MXOP",
166            Self::Ifeu => "IFEU",
167            Self::Ndex => "NDEX",
168            Self::Dbeq => "DBEQ",
169            Self::Sphr => "SPHR",
170            Self::Ltse => "LTSE",
171            Self::Xoff => "XOFF",
172            Self::Aspn => "ASPN",
173            Self::Asmt => "ASMT",
174            Self::Aspi => "ASPI",
175            Self::Equs => "EQUS",
176            Self::Ifus => "IFUS",
177            Self::Ifll => "IFLL",
178            Self::Xeur => "XEUR",
179            Self::Xeee => "XEEE",
180            Self::Xcbf => "XCBF",
181        }
182    }
183}
184
185impl AsRef<str> for Venue {
186    fn as_ref(&self) -> &str {
187        self.as_str()
188    }
189}
190
191impl Display for Venue {
192    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
193        f.write_str(self.as_str())
194    }
195}
196
197impl std::str::FromStr for Venue {
198    type Err = Error;
199
200    fn from_str(s: &str) -> Result<Self> {
201        match s {
202            "GLBX" => Ok(Self::Glbx),
203            "XNAS" => Ok(Self::Xnas),
204            "XBOS" => Ok(Self::Xbos),
205            "XPSX" => Ok(Self::Xpsx),
206            "BATS" => Ok(Self::Bats),
207            "BATY" => Ok(Self::Baty),
208            "EDGA" => Ok(Self::Edga),
209            "EDGX" => Ok(Self::Edgx),
210            "XNYS" => Ok(Self::Xnys),
211            "XCIS" => Ok(Self::Xcis),
212            "XASE" => Ok(Self::Xase),
213            "ARCX" => Ok(Self::Arcx),
214            "XCHI" => Ok(Self::Xchi),
215            "IEXG" => Ok(Self::Iexg),
216            "FINN" => Ok(Self::Finn),
217            "FINC" => Ok(Self::Finc),
218            "FINY" => Ok(Self::Finy),
219            "MEMX" => Ok(Self::Memx),
220            "EPRL" => Ok(Self::Eprl),
221            "AMXO" => Ok(Self::Amxo),
222            "XBOX" => Ok(Self::Xbox),
223            "XCBO" => Ok(Self::Xcbo),
224            "EMLD" => Ok(Self::Emld),
225            "EDGO" => Ok(Self::Edgo),
226            "GMNI" => Ok(Self::Gmni),
227            "XISX" => Ok(Self::Xisx),
228            "MCRY" => Ok(Self::Mcry),
229            "XMIO" => Ok(Self::Xmio),
230            "ARCO" => Ok(Self::Arco),
231            "OPRA" => Ok(Self::Opra),
232            "MPRL" => Ok(Self::Mprl),
233            "XNDQ" => Ok(Self::Xndq),
234            "XBXO" => Ok(Self::Xbxo),
235            "C2OX" => Ok(Self::C2Ox),
236            "XPHL" => Ok(Self::Xphl),
237            "BATO" => Ok(Self::Bato),
238            "MXOP" => Ok(Self::Mxop),
239            "IFEU" => Ok(Self::Ifeu),
240            "NDEX" => Ok(Self::Ndex),
241            "DBEQ" => Ok(Self::Dbeq),
242            "SPHR" => Ok(Self::Sphr),
243            "LTSE" => Ok(Self::Ltse),
244            "XOFF" => Ok(Self::Xoff),
245            "ASPN" => Ok(Self::Aspn),
246            "ASMT" => Ok(Self::Asmt),
247            "ASPI" => Ok(Self::Aspi),
248            "EQUS" => Ok(Self::Equs),
249            "IFUS" => Ok(Self::Ifus),
250            "IFLL" => Ok(Self::Ifll),
251            "XEUR" => Ok(Self::Xeur),
252            "XEEE" => Ok(Self::Xeee),
253            "XCBF" => Ok(Self::Xcbf),
254            _ => Err(Error::conversion::<Self>(s)),
255        }
256    }
257}
258
259/// A source of data.
260#[derive(
261    Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, IntoPrimitive, TryFromPrimitive,
262)]
263#[non_exhaustive]
264#[repr(u16)]
265pub enum Dataset {
266    /// CME MDP 3.0 Market Data
267    GlbxMdp3 = 1,
268    /// Nasdaq TotalView-ITCH
269    XnasItch = 2,
270    /// Nasdaq BX TotalView-ITCH
271    XbosItch = 3,
272    /// Nasdaq PSX TotalView-ITCH
273    XpsxItch = 4,
274    /// Cboe BZX Depth
275    BatsPitch = 5,
276    /// Cboe BYX Depth
277    BatyPitch = 6,
278    /// Cboe EDGA Depth
279    EdgaPitch = 7,
280    /// Cboe EDGX Depth
281    EdgxPitch = 8,
282    /// NYSE Integrated
283    XnysPillar = 9,
284    /// NYSE National Integrated
285    XcisPillar = 10,
286    /// NYSE American Integrated
287    XasePillar = 11,
288    /// NYSE Texas Integrated
289    XchiPillar = 12,
290    /// NYSE National BBO
291    XcisBbo = 13,
292    /// NYSE National Trades
293    XcisTrades = 14,
294    /// MEMX Memoir Depth
295    MemxMemoir = 15,
296    /// MIAX Pearl Depth
297    EprlDom = 16,
298    /// FINRA/Nasdaq TRF (DEPRECATED)
299    #[deprecated(since = "0.17.0")]
300    FinnNls = 17,
301    /// FINRA/NYSE TRF (DEPRECATED)
302    #[deprecated(since = "0.17.0")]
303    FinyTrades = 18,
304    /// OPRA Binary
305    OpraPillar = 19,
306    /// Databento US Equities Basic
307    DbeqBasic = 20,
308    /// NYSE Arca Integrated
309    ArcxPillar = 21,
310    /// IEX TOPS
311    IexgTops = 22,
312    /// Databento US Equities Plus
313    EqusPlus = 23,
314    /// NYSE BBO
315    XnysBbo = 24,
316    /// NYSE Trades
317    XnysTrades = 25,
318    /// Nasdaq QBBO
319    XnasQbbo = 26,
320    /// Nasdaq NLS
321    XnasNls = 27,
322    /// ICE Europe Commodities iMpact
323    IfeuImpact = 28,
324    /// ICE Endex iMpact
325    NdexImpact = 29,
326    /// Databento US Equities (All Feeds)
327    EqusAll = 30,
328    /// Nasdaq Basic (NLS and QBBO)
329    XnasBasic = 31,
330    /// Databento US Equities Summary
331    EqusSummary = 32,
332    /// NYSE National Trades and BBO
333    XcisTradesbbo = 33,
334    /// NYSE Trades and BBO
335    XnysTradesbbo = 34,
336    /// Databento US Equities Mini
337    EqusMini = 35,
338    /// ICE Futures US iMpact
339    IfusImpact = 36,
340    /// ICE Europe Financials iMpact
341    IfllImpact = 37,
342    /// Eurex EOBI
343    XeurEobi = 38,
344    /// European Energy Exchange EOBI
345    XeeeEobi = 39,
346    /// Cboe Futures Exchange PITCH
347    XcbfPitch = 40,
348}
349
350/// The number of [`Dataset`] variants.
351pub const DATASET_COUNT: usize = 40;
352
353impl Dataset {
354    /// Converts the dataset to its `str` representation.
355    pub const fn as_str(&self) -> &'static str {
356        match self {
357            Self::GlbxMdp3 => "GLBX.MDP3",
358            Self::XnasItch => "XNAS.ITCH",
359            Self::XbosItch => "XBOS.ITCH",
360            Self::XpsxItch => "XPSX.ITCH",
361            Self::BatsPitch => "BATS.PITCH",
362            Self::BatyPitch => "BATY.PITCH",
363            Self::EdgaPitch => "EDGA.PITCH",
364            Self::EdgxPitch => "EDGX.PITCH",
365            Self::XnysPillar => "XNYS.PILLAR",
366            Self::XcisPillar => "XCIS.PILLAR",
367            Self::XasePillar => "XASE.PILLAR",
368            Self::XchiPillar => "XCHI.PILLAR",
369            Self::XcisBbo => "XCIS.BBO",
370            Self::XcisTrades => "XCIS.TRADES",
371            Self::MemxMemoir => "MEMX.MEMOIR",
372            Self::EprlDom => "EPRL.DOM",
373            #[allow(deprecated)]
374            Self::FinnNls => "FINN.NLS",
375            #[allow(deprecated)]
376            Self::FinyTrades => "FINY.TRADES",
377            Self::OpraPillar => "OPRA.PILLAR",
378            Self::DbeqBasic => "DBEQ.BASIC",
379            Self::ArcxPillar => "ARCX.PILLAR",
380            Self::IexgTops => "IEXG.TOPS",
381            Self::EqusPlus => "EQUS.PLUS",
382            Self::XnysBbo => "XNYS.BBO",
383            Self::XnysTrades => "XNYS.TRADES",
384            Self::XnasQbbo => "XNAS.QBBO",
385            Self::XnasNls => "XNAS.NLS",
386            Self::IfeuImpact => "IFEU.IMPACT",
387            Self::NdexImpact => "NDEX.IMPACT",
388            Self::EqusAll => "EQUS.ALL",
389            Self::XnasBasic => "XNAS.BASIC",
390            Self::EqusSummary => "EQUS.SUMMARY",
391            Self::XcisTradesbbo => "XCIS.TRADESBBO",
392            Self::XnysTradesbbo => "XNYS.TRADESBBO",
393            Self::EqusMini => "EQUS.MINI",
394            Self::IfusImpact => "IFUS.IMPACT",
395            Self::IfllImpact => "IFLL.IMPACT",
396            Self::XeurEobi => "XEUR.EOBI",
397            Self::XeeeEobi => "XEEE.EOBI",
398            Self::XcbfPitch => "XCBF.PITCH",
399        }
400    }
401
402    /// Returns all [`Publisher`] values associated with a dataset.
403    pub const fn publishers(&self) -> &'static [Publisher] {
404        match self {
405            Self::GlbxMdp3 => &[Publisher::GlbxMdp3Glbx],
406            Self::XnasItch => &[Publisher::XnasItchXnas],
407            Self::XbosItch => &[Publisher::XbosItchXbos],
408            Self::XpsxItch => &[Publisher::XpsxItchXpsx],
409            Self::BatsPitch => &[Publisher::BatsPitchBats],
410            Self::BatyPitch => &[Publisher::BatyPitchBaty],
411            Self::EdgaPitch => &[Publisher::EdgaPitchEdga],
412            Self::EdgxPitch => &[Publisher::EdgxPitchEdgx],
413            Self::XnysPillar => &[Publisher::XnysPillarXnys],
414            Self::XcisPillar => &[Publisher::XcisPillarXcis],
415            Self::XasePillar => &[Publisher::XasePillarXase],
416            Self::XchiPillar => &[Publisher::XchiPillarXchi],
417            Self::XcisBbo => &[Publisher::XcisBboXcis],
418            Self::XcisTrades => &[Publisher::XcisTradesXcis],
419            Self::MemxMemoir => &[Publisher::MemxMemoirMemx],
420            Self::EprlDom => &[Publisher::EprlDomEprl],
421            #[allow(deprecated)]
422            Self::FinnNls => &[],
423            #[allow(deprecated)]
424            Self::FinyTrades => &[],
425            Self::OpraPillar => &[
426                Publisher::OpraPillarAmxo,
427                Publisher::OpraPillarXbox,
428                Publisher::OpraPillarXcbo,
429                Publisher::OpraPillarEmld,
430                Publisher::OpraPillarEdgo,
431                Publisher::OpraPillarGmni,
432                Publisher::OpraPillarXisx,
433                Publisher::OpraPillarMcry,
434                Publisher::OpraPillarXmio,
435                Publisher::OpraPillarArco,
436                Publisher::OpraPillarOpra,
437                Publisher::OpraPillarMprl,
438                Publisher::OpraPillarXndq,
439                Publisher::OpraPillarXbxo,
440                Publisher::OpraPillarC2Ox,
441                Publisher::OpraPillarXphl,
442                Publisher::OpraPillarBato,
443                Publisher::OpraPillarMxop,
444                Publisher::OpraPillarSphr,
445            ],
446            Self::DbeqBasic => &[
447                Publisher::DbeqBasicXchi,
448                Publisher::DbeqBasicXcis,
449                Publisher::DbeqBasicIexg,
450                Publisher::DbeqBasicEprl,
451                Publisher::DbeqBasicDbeq,
452            ],
453            Self::ArcxPillar => &[Publisher::ArcxPillarArcx],
454            Self::IexgTops => &[Publisher::IexgTopsIexg],
455            Self::EqusPlus => &[
456                Publisher::EqusPlusXchi,
457                Publisher::EqusPlusXcis,
458                Publisher::EqusPlusIexg,
459                Publisher::EqusPlusEprl,
460                Publisher::EqusPlusXnas,
461                Publisher::EqusPlusXnys,
462                Publisher::EqusPlusFinn,
463                Publisher::EqusPlusFiny,
464                Publisher::EqusPlusFinc,
465                Publisher::EqusPlusEqus,
466            ],
467            Self::XnysBbo => &[Publisher::XnysBboXnys],
468            Self::XnysTrades => &[
469                Publisher::XnysTradesFiny,
470                Publisher::XnysTradesXnys,
471                Publisher::XnysTradesEqus,
472            ],
473            Self::XnasQbbo => &[Publisher::XnasQbboXnas],
474            Self::XnasNls => &[
475                Publisher::XnasNlsFinn,
476                Publisher::XnasNlsFinc,
477                Publisher::XnasNlsXnas,
478                Publisher::XnasNlsXbos,
479                Publisher::XnasNlsXpsx,
480            ],
481            Self::IfeuImpact => &[Publisher::IfeuImpactIfeu, Publisher::IfeuImpactXoff],
482            Self::NdexImpact => &[Publisher::NdexImpactNdex, Publisher::NdexImpactXoff],
483            Self::EqusAll => &[
484                Publisher::EqusAllXchi,
485                Publisher::EqusAllXcis,
486                Publisher::EqusAllIexg,
487                Publisher::EqusAllEprl,
488                Publisher::EqusAllXnas,
489                Publisher::EqusAllXnys,
490                Publisher::EqusAllFinn,
491                Publisher::EqusAllFiny,
492                Publisher::EqusAllFinc,
493                Publisher::EqusAllBats,
494                Publisher::EqusAllBaty,
495                Publisher::EqusAllEdga,
496                Publisher::EqusAllEdgx,
497                Publisher::EqusAllXbos,
498                Publisher::EqusAllXpsx,
499                Publisher::EqusAllMemx,
500                Publisher::EqusAllXase,
501                Publisher::EqusAllArcx,
502                Publisher::EqusAllLtse,
503                Publisher::EqusAllEqus,
504            ],
505            Self::XnasBasic => &[
506                Publisher::XnasBasicXnas,
507                Publisher::XnasBasicFinn,
508                Publisher::XnasBasicFinc,
509                Publisher::XnasBasicXbos,
510                Publisher::XnasBasicXpsx,
511                Publisher::XnasBasicEqus,
512            ],
513            Self::EqusSummary => &[Publisher::EqusSummaryEqus],
514            Self::XcisTradesbbo => &[Publisher::XcisTradesbboXcis],
515            Self::XnysTradesbbo => &[Publisher::XnysTradesbboXnys],
516            Self::EqusMini => &[Publisher::EqusMiniEqus],
517            Self::IfusImpact => &[Publisher::IfusImpactIfus, Publisher::IfusImpactXoff],
518            Self::IfllImpact => &[Publisher::IfllImpactIfll, Publisher::IfllImpactXoff],
519            Self::XeurEobi => &[Publisher::XeurEobiXeur, Publisher::XeurEobiXoff],
520            Self::XeeeEobi => &[Publisher::XeeeEobiXeee, Publisher::XeeeEobiXoff],
521            Self::XcbfPitch => &[Publisher::XcbfPitchXcbf, Publisher::XcbfPitchXoff],
522        }
523    }
524}
525
526impl AsRef<str> for Dataset {
527    fn as_ref(&self) -> &str {
528        self.as_str()
529    }
530}
531
532impl Display for Dataset {
533    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
534        f.write_str(self.as_str())
535    }
536}
537
538impl std::str::FromStr for Dataset {
539    type Err = Error;
540
541    fn from_str(s: &str) -> Result<Self> {
542        match s {
543            "GLBX.MDP3" => Ok(Self::GlbxMdp3),
544            "XNAS.ITCH" => Ok(Self::XnasItch),
545            "XBOS.ITCH" => Ok(Self::XbosItch),
546            "XPSX.ITCH" => Ok(Self::XpsxItch),
547            "BATS.PITCH" => Ok(Self::BatsPitch),
548            "BATY.PITCH" => Ok(Self::BatyPitch),
549            "EDGA.PITCH" => Ok(Self::EdgaPitch),
550            "EDGX.PITCH" => Ok(Self::EdgxPitch),
551            "XNYS.PILLAR" => Ok(Self::XnysPillar),
552            "XCIS.PILLAR" => Ok(Self::XcisPillar),
553            "XASE.PILLAR" => Ok(Self::XasePillar),
554            "XCHI.PILLAR" => Ok(Self::XchiPillar),
555            "XCIS.BBO" => Ok(Self::XcisBbo),
556            "XCIS.TRADES" => Ok(Self::XcisTrades),
557            "MEMX.MEMOIR" => Ok(Self::MemxMemoir),
558            "EPRL.DOM" => Ok(Self::EprlDom),
559            #[allow(deprecated)]
560            "FINN.NLS" => Ok(Self::FinnNls),
561            #[allow(deprecated)]
562            "FINY.TRADES" => Ok(Self::FinyTrades),
563            "OPRA.PILLAR" => Ok(Self::OpraPillar),
564            "DBEQ.BASIC" => Ok(Self::DbeqBasic),
565            "ARCX.PILLAR" => Ok(Self::ArcxPillar),
566            "IEXG.TOPS" => Ok(Self::IexgTops),
567            "EQUS.PLUS" => Ok(Self::EqusPlus),
568            "XNYS.BBO" => Ok(Self::XnysBbo),
569            "XNYS.TRADES" => Ok(Self::XnysTrades),
570            "XNAS.QBBO" => Ok(Self::XnasQbbo),
571            "XNAS.NLS" => Ok(Self::XnasNls),
572            "IFEU.IMPACT" => Ok(Self::IfeuImpact),
573            "NDEX.IMPACT" => Ok(Self::NdexImpact),
574            "EQUS.ALL" => Ok(Self::EqusAll),
575            "XNAS.BASIC" => Ok(Self::XnasBasic),
576            "EQUS.SUMMARY" => Ok(Self::EqusSummary),
577            "XCIS.TRADESBBO" => Ok(Self::XcisTradesbbo),
578            "XNYS.TRADESBBO" => Ok(Self::XnysTradesbbo),
579            "EQUS.MINI" => Ok(Self::EqusMini),
580            "IFUS.IMPACT" => Ok(Self::IfusImpact),
581            "IFLL.IMPACT" => Ok(Self::IfllImpact),
582            "XEUR.EOBI" => Ok(Self::XeurEobi),
583            "XEEE.EOBI" => Ok(Self::XeeeEobi),
584            "XCBF.PITCH" => Ok(Self::XcbfPitch),
585            _ => Err(Error::conversion::<Self>(s)),
586        }
587    }
588}
589
590/// A specific Venue from a specific data source.
591#[derive(
592    Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, IntoPrimitive, TryFromPrimitive,
593)]
594#[non_exhaustive]
595#[repr(u16)]
596pub enum Publisher {
597    /// CME Globex MDP 3.0
598    GlbxMdp3Glbx = 1,
599    /// Nasdaq TotalView-ITCH
600    XnasItchXnas = 2,
601    /// Nasdaq BX TotalView-ITCH
602    XbosItchXbos = 3,
603    /// Nasdaq PSX TotalView-ITCH
604    XpsxItchXpsx = 4,
605    /// Cboe BZX Depth
606    BatsPitchBats = 5,
607    /// Cboe BYX Depth
608    BatyPitchBaty = 6,
609    /// Cboe EDGA Depth
610    EdgaPitchEdga = 7,
611    /// Cboe EDGX Depth
612    EdgxPitchEdgx = 8,
613    /// NYSE Integrated
614    XnysPillarXnys = 9,
615    /// NYSE National Integrated
616    XcisPillarXcis = 10,
617    /// NYSE American Integrated
618    XasePillarXase = 11,
619    /// NYSE Texas Integrated
620    XchiPillarXchi = 12,
621    /// NYSE National BBO
622    XcisBboXcis = 13,
623    /// NYSE National Trades
624    XcisTradesXcis = 14,
625    /// MEMX Memoir Depth
626    MemxMemoirMemx = 15,
627    /// MIAX Pearl Depth
628    EprlDomEprl = 16,
629    /// FINRA/Nasdaq TRF Carteret
630    XnasNlsFinn = 17,
631    /// FINRA/Nasdaq TRF Chicago
632    XnasNlsFinc = 18,
633    /// FINRA/NYSE TRF
634    XnysTradesFiny = 19,
635    /// OPRA - NYSE American Options
636    OpraPillarAmxo = 20,
637    /// OPRA - BOX Options
638    OpraPillarXbox = 21,
639    /// OPRA - Cboe Options
640    OpraPillarXcbo = 22,
641    /// OPRA - MIAX Emerald
642    OpraPillarEmld = 23,
643    /// OPRA - Cboe EDGX Options
644    OpraPillarEdgo = 24,
645    /// OPRA - Nasdaq GEMX
646    OpraPillarGmni = 25,
647    /// OPRA - Nasdaq ISE
648    OpraPillarXisx = 26,
649    /// OPRA - Nasdaq MRX
650    OpraPillarMcry = 27,
651    /// OPRA - MIAX Options
652    OpraPillarXmio = 28,
653    /// OPRA - NYSE Arca Options
654    OpraPillarArco = 29,
655    /// OPRA - Options Price Reporting Authority
656    OpraPillarOpra = 30,
657    /// OPRA - MIAX Pearl
658    OpraPillarMprl = 31,
659    /// OPRA - Nasdaq Options
660    OpraPillarXndq = 32,
661    /// OPRA - Nasdaq BX Options
662    OpraPillarXbxo = 33,
663    /// OPRA - Cboe C2 Options
664    OpraPillarC2Ox = 34,
665    /// OPRA - Nasdaq PHLX
666    OpraPillarXphl = 35,
667    /// OPRA - Cboe BZX Options
668    OpraPillarBato = 36,
669    /// OPRA - MEMX Options
670    OpraPillarMxop = 37,
671    /// IEX TOPS
672    IexgTopsIexg = 38,
673    /// DBEQ Basic - NYSE Texas
674    DbeqBasicXchi = 39,
675    /// DBEQ Basic - NYSE National
676    DbeqBasicXcis = 40,
677    /// DBEQ Basic - IEX
678    DbeqBasicIexg = 41,
679    /// DBEQ Basic - MIAX Pearl
680    DbeqBasicEprl = 42,
681    /// NYSE Arca Integrated
682    ArcxPillarArcx = 43,
683    /// NYSE BBO
684    XnysBboXnys = 44,
685    /// NYSE Trades
686    XnysTradesXnys = 45,
687    /// Nasdaq QBBO
688    XnasQbboXnas = 46,
689    /// Nasdaq Trades
690    XnasNlsXnas = 47,
691    /// Databento US Equities Plus - NYSE Texas
692    EqusPlusXchi = 48,
693    /// Databento US Equities Plus - NYSE National
694    EqusPlusXcis = 49,
695    /// Databento US Equities Plus - IEX
696    EqusPlusIexg = 50,
697    /// Databento US Equities Plus - MIAX Pearl
698    EqusPlusEprl = 51,
699    /// Databento US Equities Plus - Nasdaq
700    EqusPlusXnas = 52,
701    /// Databento US Equities Plus - NYSE
702    EqusPlusXnys = 53,
703    /// Databento US Equities Plus - FINRA/Nasdaq TRF Carteret
704    EqusPlusFinn = 54,
705    /// Databento US Equities Plus - FINRA/NYSE TRF
706    EqusPlusFiny = 55,
707    /// Databento US Equities Plus - FINRA/Nasdaq TRF Chicago
708    EqusPlusFinc = 56,
709    /// ICE Europe Commodities
710    IfeuImpactIfeu = 57,
711    /// ICE Endex
712    NdexImpactNdex = 58,
713    /// Databento US Equities Basic - Consolidated
714    DbeqBasicDbeq = 59,
715    /// EQUS Plus - Consolidated
716    EqusPlusEqus = 60,
717    /// OPRA - MIAX Sapphire
718    OpraPillarSphr = 61,
719    /// Databento US Equities (All Feeds) - NYSE Texas
720    EqusAllXchi = 62,
721    /// Databento US Equities (All Feeds) - NYSE National
722    EqusAllXcis = 63,
723    /// Databento US Equities (All Feeds) - IEX
724    EqusAllIexg = 64,
725    /// Databento US Equities (All Feeds) - MIAX Pearl
726    EqusAllEprl = 65,
727    /// Databento US Equities (All Feeds) - Nasdaq
728    EqusAllXnas = 66,
729    /// Databento US Equities (All Feeds) - NYSE
730    EqusAllXnys = 67,
731    /// Databento US Equities (All Feeds) - FINRA/Nasdaq TRF Carteret
732    EqusAllFinn = 68,
733    /// Databento US Equities (All Feeds) - FINRA/NYSE TRF
734    EqusAllFiny = 69,
735    /// Databento US Equities (All Feeds) - FINRA/Nasdaq TRF Chicago
736    EqusAllFinc = 70,
737    /// Databento US Equities (All Feeds) - Cboe BZX
738    EqusAllBats = 71,
739    /// Databento US Equities (All Feeds) - Cboe BYX
740    EqusAllBaty = 72,
741    /// Databento US Equities (All Feeds) - Cboe EDGA
742    EqusAllEdga = 73,
743    /// Databento US Equities (All Feeds) - Cboe EDGX
744    EqusAllEdgx = 74,
745    /// Databento US Equities (All Feeds) - Nasdaq BX
746    EqusAllXbos = 75,
747    /// Databento US Equities (All Feeds) - Nasdaq PSX
748    EqusAllXpsx = 76,
749    /// Databento US Equities (All Feeds) - MEMX
750    EqusAllMemx = 77,
751    /// Databento US Equities (All Feeds) - NYSE American
752    EqusAllXase = 78,
753    /// Databento US Equities (All Feeds) - NYSE Arca
754    EqusAllArcx = 79,
755    /// Databento US Equities (All Feeds) - Long-Term Stock Exchange
756    EqusAllLtse = 80,
757    /// Nasdaq Basic - Nasdaq
758    XnasBasicXnas = 81,
759    /// Nasdaq Basic - FINRA/Nasdaq TRF Carteret
760    XnasBasicFinn = 82,
761    /// Nasdaq Basic - FINRA/Nasdaq TRF Chicago
762    XnasBasicFinc = 83,
763    /// ICE Europe - Off-Market Trades
764    IfeuImpactXoff = 84,
765    /// ICE Endex - Off-Market Trades
766    NdexImpactXoff = 85,
767    /// Nasdaq NLS - Nasdaq BX
768    XnasNlsXbos = 86,
769    /// Nasdaq NLS - Nasdaq PSX
770    XnasNlsXpsx = 87,
771    /// Nasdaq Basic - Nasdaq BX
772    XnasBasicXbos = 88,
773    /// Nasdaq Basic - Nasdaq PSX
774    XnasBasicXpsx = 89,
775    /// Databento Equities Summary
776    EqusSummaryEqus = 90,
777    /// NYSE National Trades and BBO
778    XcisTradesbboXcis = 91,
779    /// NYSE Trades and BBO
780    XnysTradesbboXnys = 92,
781    /// Nasdaq Basic - Consolidated
782    XnasBasicEqus = 93,
783    /// Databento US Equities (All Feeds) - Consolidated
784    EqusAllEqus = 94,
785    /// Databento US Equities Mini
786    EqusMiniEqus = 95,
787    /// NYSE Trades - Consolidated
788    XnysTradesEqus = 96,
789    /// ICE Futures US
790    IfusImpactIfus = 97,
791    /// ICE Futures US - Off-Market Trades
792    IfusImpactXoff = 98,
793    /// ICE Europe Financials
794    IfllImpactIfll = 99,
795    /// ICE Europe Financials - Off-Market Trades
796    IfllImpactXoff = 100,
797    /// Eurex EOBI
798    XeurEobiXeur = 101,
799    /// European Energy Exchange EOBI
800    XeeeEobiXeee = 102,
801    /// Eurex EOBI - Off-Market Trades
802    XeurEobiXoff = 103,
803    /// European Energy Exchange EOBI - Off-Market Trades
804    XeeeEobiXoff = 104,
805    /// Cboe Futures Exchange
806    XcbfPitchXcbf = 105,
807    /// Cboe Futures Exchange - Off-Market Trades
808    XcbfPitchXoff = 106,
809}
810
811/// The number of [`Publisher`] variants.
812pub const PUBLISHER_COUNT: usize = 106;
813
814impl Publisher {
815    /// Converts the publisher to its `str` representation.
816    pub const fn as_str(&self) -> &'static str {
817        match self {
818            Self::GlbxMdp3Glbx => "GLBX.MDP3.GLBX",
819            Self::XnasItchXnas => "XNAS.ITCH.XNAS",
820            Self::XbosItchXbos => "XBOS.ITCH.XBOS",
821            Self::XpsxItchXpsx => "XPSX.ITCH.XPSX",
822            Self::BatsPitchBats => "BATS.PITCH.BATS",
823            Self::BatyPitchBaty => "BATY.PITCH.BATY",
824            Self::EdgaPitchEdga => "EDGA.PITCH.EDGA",
825            Self::EdgxPitchEdgx => "EDGX.PITCH.EDGX",
826            Self::XnysPillarXnys => "XNYS.PILLAR.XNYS",
827            Self::XcisPillarXcis => "XCIS.PILLAR.XCIS",
828            Self::XasePillarXase => "XASE.PILLAR.XASE",
829            Self::XchiPillarXchi => "XCHI.PILLAR.XCHI",
830            Self::XcisBboXcis => "XCIS.BBO.XCIS",
831            Self::XcisTradesXcis => "XCIS.TRADES.XCIS",
832            Self::MemxMemoirMemx => "MEMX.MEMOIR.MEMX",
833            Self::EprlDomEprl => "EPRL.DOM.EPRL",
834            Self::XnasNlsFinn => "XNAS.NLS.FINN",
835            Self::XnasNlsFinc => "XNAS.NLS.FINC",
836            Self::XnysTradesFiny => "XNYS.TRADES.FINY",
837            Self::OpraPillarAmxo => "OPRA.PILLAR.AMXO",
838            Self::OpraPillarXbox => "OPRA.PILLAR.XBOX",
839            Self::OpraPillarXcbo => "OPRA.PILLAR.XCBO",
840            Self::OpraPillarEmld => "OPRA.PILLAR.EMLD",
841            Self::OpraPillarEdgo => "OPRA.PILLAR.EDGO",
842            Self::OpraPillarGmni => "OPRA.PILLAR.GMNI",
843            Self::OpraPillarXisx => "OPRA.PILLAR.XISX",
844            Self::OpraPillarMcry => "OPRA.PILLAR.MCRY",
845            Self::OpraPillarXmio => "OPRA.PILLAR.XMIO",
846            Self::OpraPillarArco => "OPRA.PILLAR.ARCO",
847            Self::OpraPillarOpra => "OPRA.PILLAR.OPRA",
848            Self::OpraPillarMprl => "OPRA.PILLAR.MPRL",
849            Self::OpraPillarXndq => "OPRA.PILLAR.XNDQ",
850            Self::OpraPillarXbxo => "OPRA.PILLAR.XBXO",
851            Self::OpraPillarC2Ox => "OPRA.PILLAR.C2OX",
852            Self::OpraPillarXphl => "OPRA.PILLAR.XPHL",
853            Self::OpraPillarBato => "OPRA.PILLAR.BATO",
854            Self::OpraPillarMxop => "OPRA.PILLAR.MXOP",
855            Self::IexgTopsIexg => "IEXG.TOPS.IEXG",
856            Self::DbeqBasicXchi => "DBEQ.BASIC.XCHI",
857            Self::DbeqBasicXcis => "DBEQ.BASIC.XCIS",
858            Self::DbeqBasicIexg => "DBEQ.BASIC.IEXG",
859            Self::DbeqBasicEprl => "DBEQ.BASIC.EPRL",
860            Self::ArcxPillarArcx => "ARCX.PILLAR.ARCX",
861            Self::XnysBboXnys => "XNYS.BBO.XNYS",
862            Self::XnysTradesXnys => "XNYS.TRADES.XNYS",
863            Self::XnasQbboXnas => "XNAS.QBBO.XNAS",
864            Self::XnasNlsXnas => "XNAS.NLS.XNAS",
865            Self::EqusPlusXchi => "EQUS.PLUS.XCHI",
866            Self::EqusPlusXcis => "EQUS.PLUS.XCIS",
867            Self::EqusPlusIexg => "EQUS.PLUS.IEXG",
868            Self::EqusPlusEprl => "EQUS.PLUS.EPRL",
869            Self::EqusPlusXnas => "EQUS.PLUS.XNAS",
870            Self::EqusPlusXnys => "EQUS.PLUS.XNYS",
871            Self::EqusPlusFinn => "EQUS.PLUS.FINN",
872            Self::EqusPlusFiny => "EQUS.PLUS.FINY",
873            Self::EqusPlusFinc => "EQUS.PLUS.FINC",
874            Self::IfeuImpactIfeu => "IFEU.IMPACT.IFEU",
875            Self::NdexImpactNdex => "NDEX.IMPACT.NDEX",
876            Self::DbeqBasicDbeq => "DBEQ.BASIC.DBEQ",
877            Self::EqusPlusEqus => "EQUS.PLUS.EQUS",
878            Self::OpraPillarSphr => "OPRA.PILLAR.SPHR",
879            Self::EqusAllXchi => "EQUS.ALL.XCHI",
880            Self::EqusAllXcis => "EQUS.ALL.XCIS",
881            Self::EqusAllIexg => "EQUS.ALL.IEXG",
882            Self::EqusAllEprl => "EQUS.ALL.EPRL",
883            Self::EqusAllXnas => "EQUS.ALL.XNAS",
884            Self::EqusAllXnys => "EQUS.ALL.XNYS",
885            Self::EqusAllFinn => "EQUS.ALL.FINN",
886            Self::EqusAllFiny => "EQUS.ALL.FINY",
887            Self::EqusAllFinc => "EQUS.ALL.FINC",
888            Self::EqusAllBats => "EQUS.ALL.BATS",
889            Self::EqusAllBaty => "EQUS.ALL.BATY",
890            Self::EqusAllEdga => "EQUS.ALL.EDGA",
891            Self::EqusAllEdgx => "EQUS.ALL.EDGX",
892            Self::EqusAllXbos => "EQUS.ALL.XBOS",
893            Self::EqusAllXpsx => "EQUS.ALL.XPSX",
894            Self::EqusAllMemx => "EQUS.ALL.MEMX",
895            Self::EqusAllXase => "EQUS.ALL.XASE",
896            Self::EqusAllArcx => "EQUS.ALL.ARCX",
897            Self::EqusAllLtse => "EQUS.ALL.LTSE",
898            Self::XnasBasicXnas => "XNAS.BASIC.XNAS",
899            Self::XnasBasicFinn => "XNAS.BASIC.FINN",
900            Self::XnasBasicFinc => "XNAS.BASIC.FINC",
901            Self::IfeuImpactXoff => "IFEU.IMPACT.XOFF",
902            Self::NdexImpactXoff => "NDEX.IMPACT.XOFF",
903            Self::XnasNlsXbos => "XNAS.NLS.XBOS",
904            Self::XnasNlsXpsx => "XNAS.NLS.XPSX",
905            Self::XnasBasicXbos => "XNAS.BASIC.XBOS",
906            Self::XnasBasicXpsx => "XNAS.BASIC.XPSX",
907            Self::EqusSummaryEqus => "EQUS.SUMMARY.EQUS",
908            Self::XcisTradesbboXcis => "XCIS.TRADESBBO.XCIS",
909            Self::XnysTradesbboXnys => "XNYS.TRADESBBO.XNYS",
910            Self::XnasBasicEqus => "XNAS.BASIC.EQUS",
911            Self::EqusAllEqus => "EQUS.ALL.EQUS",
912            Self::EqusMiniEqus => "EQUS.MINI.EQUS",
913            Self::XnysTradesEqus => "XNYS.TRADES.EQUS",
914            Self::IfusImpactIfus => "IFUS.IMPACT.IFUS",
915            Self::IfusImpactXoff => "IFUS.IMPACT.XOFF",
916            Self::IfllImpactIfll => "IFLL.IMPACT.IFLL",
917            Self::IfllImpactXoff => "IFLL.IMPACT.XOFF",
918            Self::XeurEobiXeur => "XEUR.EOBI.XEUR",
919            Self::XeeeEobiXeee => "XEEE.EOBI.XEEE",
920            Self::XeurEobiXoff => "XEUR.EOBI.XOFF",
921            Self::XeeeEobiXoff => "XEEE.EOBI.XOFF",
922            Self::XcbfPitchXcbf => "XCBF.PITCH.XCBF",
923            Self::XcbfPitchXoff => "XCBF.PITCH.XOFF",
924        }
925    }
926
927    /// Returns the publisher's [`Venue`].
928    pub const fn venue(&self) -> Venue {
929        match self {
930            Self::GlbxMdp3Glbx => Venue::Glbx,
931            Self::XnasItchXnas => Venue::Xnas,
932            Self::XbosItchXbos => Venue::Xbos,
933            Self::XpsxItchXpsx => Venue::Xpsx,
934            Self::BatsPitchBats => Venue::Bats,
935            Self::BatyPitchBaty => Venue::Baty,
936            Self::EdgaPitchEdga => Venue::Edga,
937            Self::EdgxPitchEdgx => Venue::Edgx,
938            Self::XnysPillarXnys => Venue::Xnys,
939            Self::XcisPillarXcis => Venue::Xcis,
940            Self::XasePillarXase => Venue::Xase,
941            Self::XchiPillarXchi => Venue::Xchi,
942            Self::XcisBboXcis => Venue::Xcis,
943            Self::XcisTradesXcis => Venue::Xcis,
944            Self::MemxMemoirMemx => Venue::Memx,
945            Self::EprlDomEprl => Venue::Eprl,
946            Self::XnasNlsFinn => Venue::Finn,
947            Self::XnasNlsFinc => Venue::Finc,
948            Self::XnysTradesFiny => Venue::Finy,
949            Self::OpraPillarAmxo => Venue::Amxo,
950            Self::OpraPillarXbox => Venue::Xbox,
951            Self::OpraPillarXcbo => Venue::Xcbo,
952            Self::OpraPillarEmld => Venue::Emld,
953            Self::OpraPillarEdgo => Venue::Edgo,
954            Self::OpraPillarGmni => Venue::Gmni,
955            Self::OpraPillarXisx => Venue::Xisx,
956            Self::OpraPillarMcry => Venue::Mcry,
957            Self::OpraPillarXmio => Venue::Xmio,
958            Self::OpraPillarArco => Venue::Arco,
959            Self::OpraPillarOpra => Venue::Opra,
960            Self::OpraPillarMprl => Venue::Mprl,
961            Self::OpraPillarXndq => Venue::Xndq,
962            Self::OpraPillarXbxo => Venue::Xbxo,
963            Self::OpraPillarC2Ox => Venue::C2Ox,
964            Self::OpraPillarXphl => Venue::Xphl,
965            Self::OpraPillarBato => Venue::Bato,
966            Self::OpraPillarMxop => Venue::Mxop,
967            Self::IexgTopsIexg => Venue::Iexg,
968            Self::DbeqBasicXchi => Venue::Xchi,
969            Self::DbeqBasicXcis => Venue::Xcis,
970            Self::DbeqBasicIexg => Venue::Iexg,
971            Self::DbeqBasicEprl => Venue::Eprl,
972            Self::ArcxPillarArcx => Venue::Arcx,
973            Self::XnysBboXnys => Venue::Xnys,
974            Self::XnysTradesXnys => Venue::Xnys,
975            Self::XnasQbboXnas => Venue::Xnas,
976            Self::XnasNlsXnas => Venue::Xnas,
977            Self::EqusPlusXchi => Venue::Xchi,
978            Self::EqusPlusXcis => Venue::Xcis,
979            Self::EqusPlusIexg => Venue::Iexg,
980            Self::EqusPlusEprl => Venue::Eprl,
981            Self::EqusPlusXnas => Venue::Xnas,
982            Self::EqusPlusXnys => Venue::Xnys,
983            Self::EqusPlusFinn => Venue::Finn,
984            Self::EqusPlusFiny => Venue::Finy,
985            Self::EqusPlusFinc => Venue::Finc,
986            Self::IfeuImpactIfeu => Venue::Ifeu,
987            Self::NdexImpactNdex => Venue::Ndex,
988            Self::DbeqBasicDbeq => Venue::Dbeq,
989            Self::EqusPlusEqus => Venue::Equs,
990            Self::OpraPillarSphr => Venue::Sphr,
991            Self::EqusAllXchi => Venue::Xchi,
992            Self::EqusAllXcis => Venue::Xcis,
993            Self::EqusAllIexg => Venue::Iexg,
994            Self::EqusAllEprl => Venue::Eprl,
995            Self::EqusAllXnas => Venue::Xnas,
996            Self::EqusAllXnys => Venue::Xnys,
997            Self::EqusAllFinn => Venue::Finn,
998            Self::EqusAllFiny => Venue::Finy,
999            Self::EqusAllFinc => Venue::Finc,
1000            Self::EqusAllBats => Venue::Bats,
1001            Self::EqusAllBaty => Venue::Baty,
1002            Self::EqusAllEdga => Venue::Edga,
1003            Self::EqusAllEdgx => Venue::Edgx,
1004            Self::EqusAllXbos => Venue::Xbos,
1005            Self::EqusAllXpsx => Venue::Xpsx,
1006            Self::EqusAllMemx => Venue::Memx,
1007            Self::EqusAllXase => Venue::Xase,
1008            Self::EqusAllArcx => Venue::Arcx,
1009            Self::EqusAllLtse => Venue::Ltse,
1010            Self::XnasBasicXnas => Venue::Xnas,
1011            Self::XnasBasicFinn => Venue::Finn,
1012            Self::XnasBasicFinc => Venue::Finc,
1013            Self::IfeuImpactXoff => Venue::Xoff,
1014            Self::NdexImpactXoff => Venue::Xoff,
1015            Self::XnasNlsXbos => Venue::Xbos,
1016            Self::XnasNlsXpsx => Venue::Xpsx,
1017            Self::XnasBasicXbos => Venue::Xbos,
1018            Self::XnasBasicXpsx => Venue::Xpsx,
1019            Self::EqusSummaryEqus => Venue::Equs,
1020            Self::XcisTradesbboXcis => Venue::Xcis,
1021            Self::XnysTradesbboXnys => Venue::Xnys,
1022            Self::XnasBasicEqus => Venue::Equs,
1023            Self::EqusAllEqus => Venue::Equs,
1024            Self::EqusMiniEqus => Venue::Equs,
1025            Self::XnysTradesEqus => Venue::Equs,
1026            Self::IfusImpactIfus => Venue::Ifus,
1027            Self::IfusImpactXoff => Venue::Xoff,
1028            Self::IfllImpactIfll => Venue::Ifll,
1029            Self::IfllImpactXoff => Venue::Xoff,
1030            Self::XeurEobiXeur => Venue::Xeur,
1031            Self::XeeeEobiXeee => Venue::Xeee,
1032            Self::XeurEobiXoff => Venue::Xoff,
1033            Self::XeeeEobiXoff => Venue::Xoff,
1034            Self::XcbfPitchXcbf => Venue::Xcbf,
1035            Self::XcbfPitchXoff => Venue::Xoff,
1036        }
1037    }
1038
1039    /// Returns the publisher's [`Dataset`].
1040    pub const fn dataset(&self) -> Dataset {
1041        match self {
1042            Self::GlbxMdp3Glbx => Dataset::GlbxMdp3,
1043            Self::XnasItchXnas => Dataset::XnasItch,
1044            Self::XbosItchXbos => Dataset::XbosItch,
1045            Self::XpsxItchXpsx => Dataset::XpsxItch,
1046            Self::BatsPitchBats => Dataset::BatsPitch,
1047            Self::BatyPitchBaty => Dataset::BatyPitch,
1048            Self::EdgaPitchEdga => Dataset::EdgaPitch,
1049            Self::EdgxPitchEdgx => Dataset::EdgxPitch,
1050            Self::XnysPillarXnys => Dataset::XnysPillar,
1051            Self::XcisPillarXcis => Dataset::XcisPillar,
1052            Self::XasePillarXase => Dataset::XasePillar,
1053            Self::XchiPillarXchi => Dataset::XchiPillar,
1054            Self::XcisBboXcis => Dataset::XcisBbo,
1055            Self::XcisTradesXcis => Dataset::XcisTrades,
1056            Self::MemxMemoirMemx => Dataset::MemxMemoir,
1057            Self::EprlDomEprl => Dataset::EprlDom,
1058            Self::XnasNlsFinn => Dataset::XnasNls,
1059            Self::XnasNlsFinc => Dataset::XnasNls,
1060            Self::XnysTradesFiny => Dataset::XnysTrades,
1061            Self::OpraPillarAmxo => Dataset::OpraPillar,
1062            Self::OpraPillarXbox => Dataset::OpraPillar,
1063            Self::OpraPillarXcbo => Dataset::OpraPillar,
1064            Self::OpraPillarEmld => Dataset::OpraPillar,
1065            Self::OpraPillarEdgo => Dataset::OpraPillar,
1066            Self::OpraPillarGmni => Dataset::OpraPillar,
1067            Self::OpraPillarXisx => Dataset::OpraPillar,
1068            Self::OpraPillarMcry => Dataset::OpraPillar,
1069            Self::OpraPillarXmio => Dataset::OpraPillar,
1070            Self::OpraPillarArco => Dataset::OpraPillar,
1071            Self::OpraPillarOpra => Dataset::OpraPillar,
1072            Self::OpraPillarMprl => Dataset::OpraPillar,
1073            Self::OpraPillarXndq => Dataset::OpraPillar,
1074            Self::OpraPillarXbxo => Dataset::OpraPillar,
1075            Self::OpraPillarC2Ox => Dataset::OpraPillar,
1076            Self::OpraPillarXphl => Dataset::OpraPillar,
1077            Self::OpraPillarBato => Dataset::OpraPillar,
1078            Self::OpraPillarMxop => Dataset::OpraPillar,
1079            Self::IexgTopsIexg => Dataset::IexgTops,
1080            Self::DbeqBasicXchi => Dataset::DbeqBasic,
1081            Self::DbeqBasicXcis => Dataset::DbeqBasic,
1082            Self::DbeqBasicIexg => Dataset::DbeqBasic,
1083            Self::DbeqBasicEprl => Dataset::DbeqBasic,
1084            Self::ArcxPillarArcx => Dataset::ArcxPillar,
1085            Self::XnysBboXnys => Dataset::XnysBbo,
1086            Self::XnysTradesXnys => Dataset::XnysTrades,
1087            Self::XnasQbboXnas => Dataset::XnasQbbo,
1088            Self::XnasNlsXnas => Dataset::XnasNls,
1089            Self::EqusPlusXchi => Dataset::EqusPlus,
1090            Self::EqusPlusXcis => Dataset::EqusPlus,
1091            Self::EqusPlusIexg => Dataset::EqusPlus,
1092            Self::EqusPlusEprl => Dataset::EqusPlus,
1093            Self::EqusPlusXnas => Dataset::EqusPlus,
1094            Self::EqusPlusXnys => Dataset::EqusPlus,
1095            Self::EqusPlusFinn => Dataset::EqusPlus,
1096            Self::EqusPlusFiny => Dataset::EqusPlus,
1097            Self::EqusPlusFinc => Dataset::EqusPlus,
1098            Self::IfeuImpactIfeu => Dataset::IfeuImpact,
1099            Self::NdexImpactNdex => Dataset::NdexImpact,
1100            Self::DbeqBasicDbeq => Dataset::DbeqBasic,
1101            Self::EqusPlusEqus => Dataset::EqusPlus,
1102            Self::OpraPillarSphr => Dataset::OpraPillar,
1103            Self::EqusAllXchi => Dataset::EqusAll,
1104            Self::EqusAllXcis => Dataset::EqusAll,
1105            Self::EqusAllIexg => Dataset::EqusAll,
1106            Self::EqusAllEprl => Dataset::EqusAll,
1107            Self::EqusAllXnas => Dataset::EqusAll,
1108            Self::EqusAllXnys => Dataset::EqusAll,
1109            Self::EqusAllFinn => Dataset::EqusAll,
1110            Self::EqusAllFiny => Dataset::EqusAll,
1111            Self::EqusAllFinc => Dataset::EqusAll,
1112            Self::EqusAllBats => Dataset::EqusAll,
1113            Self::EqusAllBaty => Dataset::EqusAll,
1114            Self::EqusAllEdga => Dataset::EqusAll,
1115            Self::EqusAllEdgx => Dataset::EqusAll,
1116            Self::EqusAllXbos => Dataset::EqusAll,
1117            Self::EqusAllXpsx => Dataset::EqusAll,
1118            Self::EqusAllMemx => Dataset::EqusAll,
1119            Self::EqusAllXase => Dataset::EqusAll,
1120            Self::EqusAllArcx => Dataset::EqusAll,
1121            Self::EqusAllLtse => Dataset::EqusAll,
1122            Self::XnasBasicXnas => Dataset::XnasBasic,
1123            Self::XnasBasicFinn => Dataset::XnasBasic,
1124            Self::XnasBasicFinc => Dataset::XnasBasic,
1125            Self::IfeuImpactXoff => Dataset::IfeuImpact,
1126            Self::NdexImpactXoff => Dataset::NdexImpact,
1127            Self::XnasNlsXbos => Dataset::XnasNls,
1128            Self::XnasNlsXpsx => Dataset::XnasNls,
1129            Self::XnasBasicXbos => Dataset::XnasBasic,
1130            Self::XnasBasicXpsx => Dataset::XnasBasic,
1131            Self::EqusSummaryEqus => Dataset::EqusSummary,
1132            Self::XcisTradesbboXcis => Dataset::XcisTradesbbo,
1133            Self::XnysTradesbboXnys => Dataset::XnysTradesbbo,
1134            Self::XnasBasicEqus => Dataset::XnasBasic,
1135            Self::EqusAllEqus => Dataset::EqusAll,
1136            Self::EqusMiniEqus => Dataset::EqusMini,
1137            Self::XnysTradesEqus => Dataset::XnysTrades,
1138            Self::IfusImpactIfus => Dataset::IfusImpact,
1139            Self::IfusImpactXoff => Dataset::IfusImpact,
1140            Self::IfllImpactIfll => Dataset::IfllImpact,
1141            Self::IfllImpactXoff => Dataset::IfllImpact,
1142            Self::XeurEobiXeur => Dataset::XeurEobi,
1143            Self::XeeeEobiXeee => Dataset::XeeeEobi,
1144            Self::XeurEobiXoff => Dataset::XeurEobi,
1145            Self::XeeeEobiXoff => Dataset::XeeeEobi,
1146            Self::XcbfPitchXcbf => Dataset::XcbfPitch,
1147            Self::XcbfPitchXoff => Dataset::XcbfPitch,
1148        }
1149    }
1150
1151    /// Construct a [`Publisher`] from its components.
1152    ///
1153    /// # Errors
1154    /// Returns an error if there's no [`Publisher`] with the corresponding [`Dataset`] and [`Venue`] combination.
1155    pub fn from_dataset_venue(dataset: Dataset, venue: Venue) -> Result<Self> {
1156        match (dataset, venue) {
1157            (Dataset::GlbxMdp3, Venue::Glbx) => Ok(Self::GlbxMdp3Glbx),
1158            (Dataset::XnasItch, Venue::Xnas) => Ok(Self::XnasItchXnas),
1159            (Dataset::XbosItch, Venue::Xbos) => Ok(Self::XbosItchXbos),
1160            (Dataset::XpsxItch, Venue::Xpsx) => Ok(Self::XpsxItchXpsx),
1161            (Dataset::BatsPitch, Venue::Bats) => Ok(Self::BatsPitchBats),
1162            (Dataset::BatyPitch, Venue::Baty) => Ok(Self::BatyPitchBaty),
1163            (Dataset::EdgaPitch, Venue::Edga) => Ok(Self::EdgaPitchEdga),
1164            (Dataset::EdgxPitch, Venue::Edgx) => Ok(Self::EdgxPitchEdgx),
1165            (Dataset::XnysPillar, Venue::Xnys) => Ok(Self::XnysPillarXnys),
1166            (Dataset::XcisPillar, Venue::Xcis) => Ok(Self::XcisPillarXcis),
1167            (Dataset::XasePillar, Venue::Xase) => Ok(Self::XasePillarXase),
1168            (Dataset::XchiPillar, Venue::Xchi) => Ok(Self::XchiPillarXchi),
1169            (Dataset::XcisBbo, Venue::Xcis) => Ok(Self::XcisBboXcis),
1170            (Dataset::XcisTrades, Venue::Xcis) => Ok(Self::XcisTradesXcis),
1171            (Dataset::MemxMemoir, Venue::Memx) => Ok(Self::MemxMemoirMemx),
1172            (Dataset::EprlDom, Venue::Eprl) => Ok(Self::EprlDomEprl),
1173            (Dataset::XnasNls, Venue::Finn) => Ok(Self::XnasNlsFinn),
1174            (Dataset::XnasNls, Venue::Finc) => Ok(Self::XnasNlsFinc),
1175            (Dataset::XnysTrades, Venue::Finy) => Ok(Self::XnysTradesFiny),
1176            (Dataset::OpraPillar, Venue::Amxo) => Ok(Self::OpraPillarAmxo),
1177            (Dataset::OpraPillar, Venue::Xbox) => Ok(Self::OpraPillarXbox),
1178            (Dataset::OpraPillar, Venue::Xcbo) => Ok(Self::OpraPillarXcbo),
1179            (Dataset::OpraPillar, Venue::Emld) => Ok(Self::OpraPillarEmld),
1180            (Dataset::OpraPillar, Venue::Edgo) => Ok(Self::OpraPillarEdgo),
1181            (Dataset::OpraPillar, Venue::Gmni) => Ok(Self::OpraPillarGmni),
1182            (Dataset::OpraPillar, Venue::Xisx) => Ok(Self::OpraPillarXisx),
1183            (Dataset::OpraPillar, Venue::Mcry) => Ok(Self::OpraPillarMcry),
1184            (Dataset::OpraPillar, Venue::Xmio) => Ok(Self::OpraPillarXmio),
1185            (Dataset::OpraPillar, Venue::Arco) => Ok(Self::OpraPillarArco),
1186            (Dataset::OpraPillar, Venue::Opra) => Ok(Self::OpraPillarOpra),
1187            (Dataset::OpraPillar, Venue::Mprl) => Ok(Self::OpraPillarMprl),
1188            (Dataset::OpraPillar, Venue::Xndq) => Ok(Self::OpraPillarXndq),
1189            (Dataset::OpraPillar, Venue::Xbxo) => Ok(Self::OpraPillarXbxo),
1190            (Dataset::OpraPillar, Venue::C2Ox) => Ok(Self::OpraPillarC2Ox),
1191            (Dataset::OpraPillar, Venue::Xphl) => Ok(Self::OpraPillarXphl),
1192            (Dataset::OpraPillar, Venue::Bato) => Ok(Self::OpraPillarBato),
1193            (Dataset::OpraPillar, Venue::Mxop) => Ok(Self::OpraPillarMxop),
1194            (Dataset::IexgTops, Venue::Iexg) => Ok(Self::IexgTopsIexg),
1195            (Dataset::DbeqBasic, Venue::Xchi) => Ok(Self::DbeqBasicXchi),
1196            (Dataset::DbeqBasic, Venue::Xcis) => Ok(Self::DbeqBasicXcis),
1197            (Dataset::DbeqBasic, Venue::Iexg) => Ok(Self::DbeqBasicIexg),
1198            (Dataset::DbeqBasic, Venue::Eprl) => Ok(Self::DbeqBasicEprl),
1199            (Dataset::ArcxPillar, Venue::Arcx) => Ok(Self::ArcxPillarArcx),
1200            (Dataset::XnysBbo, Venue::Xnys) => Ok(Self::XnysBboXnys),
1201            (Dataset::XnysTrades, Venue::Xnys) => Ok(Self::XnysTradesXnys),
1202            (Dataset::XnasQbbo, Venue::Xnas) => Ok(Self::XnasQbboXnas),
1203            (Dataset::XnasNls, Venue::Xnas) => Ok(Self::XnasNlsXnas),
1204            (Dataset::EqusPlus, Venue::Xchi) => Ok(Self::EqusPlusXchi),
1205            (Dataset::EqusPlus, Venue::Xcis) => Ok(Self::EqusPlusXcis),
1206            (Dataset::EqusPlus, Venue::Iexg) => Ok(Self::EqusPlusIexg),
1207            (Dataset::EqusPlus, Venue::Eprl) => Ok(Self::EqusPlusEprl),
1208            (Dataset::EqusPlus, Venue::Xnas) => Ok(Self::EqusPlusXnas),
1209            (Dataset::EqusPlus, Venue::Xnys) => Ok(Self::EqusPlusXnys),
1210            (Dataset::EqusPlus, Venue::Finn) => Ok(Self::EqusPlusFinn),
1211            (Dataset::EqusPlus, Venue::Finy) => Ok(Self::EqusPlusFiny),
1212            (Dataset::EqusPlus, Venue::Finc) => Ok(Self::EqusPlusFinc),
1213            (Dataset::IfeuImpact, Venue::Ifeu) => Ok(Self::IfeuImpactIfeu),
1214            (Dataset::NdexImpact, Venue::Ndex) => Ok(Self::NdexImpactNdex),
1215            (Dataset::DbeqBasic, Venue::Dbeq) => Ok(Self::DbeqBasicDbeq),
1216            (Dataset::EqusPlus, Venue::Equs) => Ok(Self::EqusPlusEqus),
1217            (Dataset::OpraPillar, Venue::Sphr) => Ok(Self::OpraPillarSphr),
1218            (Dataset::EqusAll, Venue::Xchi) => Ok(Self::EqusAllXchi),
1219            (Dataset::EqusAll, Venue::Xcis) => Ok(Self::EqusAllXcis),
1220            (Dataset::EqusAll, Venue::Iexg) => Ok(Self::EqusAllIexg),
1221            (Dataset::EqusAll, Venue::Eprl) => Ok(Self::EqusAllEprl),
1222            (Dataset::EqusAll, Venue::Xnas) => Ok(Self::EqusAllXnas),
1223            (Dataset::EqusAll, Venue::Xnys) => Ok(Self::EqusAllXnys),
1224            (Dataset::EqusAll, Venue::Finn) => Ok(Self::EqusAllFinn),
1225            (Dataset::EqusAll, Venue::Finy) => Ok(Self::EqusAllFiny),
1226            (Dataset::EqusAll, Venue::Finc) => Ok(Self::EqusAllFinc),
1227            (Dataset::EqusAll, Venue::Bats) => Ok(Self::EqusAllBats),
1228            (Dataset::EqusAll, Venue::Baty) => Ok(Self::EqusAllBaty),
1229            (Dataset::EqusAll, Venue::Edga) => Ok(Self::EqusAllEdga),
1230            (Dataset::EqusAll, Venue::Edgx) => Ok(Self::EqusAllEdgx),
1231            (Dataset::EqusAll, Venue::Xbos) => Ok(Self::EqusAllXbos),
1232            (Dataset::EqusAll, Venue::Xpsx) => Ok(Self::EqusAllXpsx),
1233            (Dataset::EqusAll, Venue::Memx) => Ok(Self::EqusAllMemx),
1234            (Dataset::EqusAll, Venue::Xase) => Ok(Self::EqusAllXase),
1235            (Dataset::EqusAll, Venue::Arcx) => Ok(Self::EqusAllArcx),
1236            (Dataset::EqusAll, Venue::Ltse) => Ok(Self::EqusAllLtse),
1237            (Dataset::XnasBasic, Venue::Xnas) => Ok(Self::XnasBasicXnas),
1238            (Dataset::XnasBasic, Venue::Finn) => Ok(Self::XnasBasicFinn),
1239            (Dataset::XnasBasic, Venue::Finc) => Ok(Self::XnasBasicFinc),
1240            (Dataset::IfeuImpact, Venue::Xoff) => Ok(Self::IfeuImpactXoff),
1241            (Dataset::NdexImpact, Venue::Xoff) => Ok(Self::NdexImpactXoff),
1242            (Dataset::XnasNls, Venue::Xbos) => Ok(Self::XnasNlsXbos),
1243            (Dataset::XnasNls, Venue::Xpsx) => Ok(Self::XnasNlsXpsx),
1244            (Dataset::XnasBasic, Venue::Xbos) => Ok(Self::XnasBasicXbos),
1245            (Dataset::XnasBasic, Venue::Xpsx) => Ok(Self::XnasBasicXpsx),
1246            (Dataset::EqusSummary, Venue::Equs) => Ok(Self::EqusSummaryEqus),
1247            (Dataset::XcisTradesbbo, Venue::Xcis) => Ok(Self::XcisTradesbboXcis),
1248            (Dataset::XnysTradesbbo, Venue::Xnys) => Ok(Self::XnysTradesbboXnys),
1249            (Dataset::XnasBasic, Venue::Equs) => Ok(Self::XnasBasicEqus),
1250            (Dataset::EqusAll, Venue::Equs) => Ok(Self::EqusAllEqus),
1251            (Dataset::EqusMini, Venue::Equs) => Ok(Self::EqusMiniEqus),
1252            (Dataset::XnysTrades, Venue::Equs) => Ok(Self::XnysTradesEqus),
1253            (Dataset::IfusImpact, Venue::Ifus) => Ok(Self::IfusImpactIfus),
1254            (Dataset::IfusImpact, Venue::Xoff) => Ok(Self::IfusImpactXoff),
1255            (Dataset::IfllImpact, Venue::Ifll) => Ok(Self::IfllImpactIfll),
1256            (Dataset::IfllImpact, Venue::Xoff) => Ok(Self::IfllImpactXoff),
1257            (Dataset::XeurEobi, Venue::Xeur) => Ok(Self::XeurEobiXeur),
1258            (Dataset::XeeeEobi, Venue::Xeee) => Ok(Self::XeeeEobiXeee),
1259            (Dataset::XeurEobi, Venue::Xoff) => Ok(Self::XeurEobiXoff),
1260            (Dataset::XeeeEobi, Venue::Xoff) => Ok(Self::XeeeEobiXoff),
1261            (Dataset::XcbfPitch, Venue::Xcbf) => Ok(Self::XcbfPitchXcbf),
1262            (Dataset::XcbfPitch, Venue::Xoff) => Ok(Self::XcbfPitchXoff),
1263            _ => Err(Error::conversion::<Self>(format!("({dataset}, {venue})"))),
1264        }
1265    }
1266}
1267
1268impl AsRef<str> for Publisher {
1269    fn as_ref(&self) -> &str {
1270        self.as_str()
1271    }
1272}
1273
1274impl Display for Publisher {
1275    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
1276        f.write_str(self.as_str())
1277    }
1278}
1279
1280impl std::str::FromStr for Publisher {
1281    type Err = Error;
1282
1283    fn from_str(s: &str) -> Result<Self> {
1284        match s {
1285            "GLBX.MDP3.GLBX" => Ok(Self::GlbxMdp3Glbx),
1286            "XNAS.ITCH.XNAS" => Ok(Self::XnasItchXnas),
1287            "XBOS.ITCH.XBOS" => Ok(Self::XbosItchXbos),
1288            "XPSX.ITCH.XPSX" => Ok(Self::XpsxItchXpsx),
1289            "BATS.PITCH.BATS" => Ok(Self::BatsPitchBats),
1290            "BATY.PITCH.BATY" => Ok(Self::BatyPitchBaty),
1291            "EDGA.PITCH.EDGA" => Ok(Self::EdgaPitchEdga),
1292            "EDGX.PITCH.EDGX" => Ok(Self::EdgxPitchEdgx),
1293            "XNYS.PILLAR.XNYS" => Ok(Self::XnysPillarXnys),
1294            "XCIS.PILLAR.XCIS" => Ok(Self::XcisPillarXcis),
1295            "XASE.PILLAR.XASE" => Ok(Self::XasePillarXase),
1296            "XCHI.PILLAR.XCHI" => Ok(Self::XchiPillarXchi),
1297            "XCIS.BBO.XCIS" => Ok(Self::XcisBboXcis),
1298            "XCIS.TRADES.XCIS" => Ok(Self::XcisTradesXcis),
1299            "MEMX.MEMOIR.MEMX" => Ok(Self::MemxMemoirMemx),
1300            "EPRL.DOM.EPRL" => Ok(Self::EprlDomEprl),
1301            "XNAS.NLS.FINN" => Ok(Self::XnasNlsFinn),
1302            "XNAS.NLS.FINC" => Ok(Self::XnasNlsFinc),
1303            "XNYS.TRADES.FINY" => Ok(Self::XnysTradesFiny),
1304            "OPRA.PILLAR.AMXO" => Ok(Self::OpraPillarAmxo),
1305            "OPRA.PILLAR.XBOX" => Ok(Self::OpraPillarXbox),
1306            "OPRA.PILLAR.XCBO" => Ok(Self::OpraPillarXcbo),
1307            "OPRA.PILLAR.EMLD" => Ok(Self::OpraPillarEmld),
1308            "OPRA.PILLAR.EDGO" => Ok(Self::OpraPillarEdgo),
1309            "OPRA.PILLAR.GMNI" => Ok(Self::OpraPillarGmni),
1310            "OPRA.PILLAR.XISX" => Ok(Self::OpraPillarXisx),
1311            "OPRA.PILLAR.MCRY" => Ok(Self::OpraPillarMcry),
1312            "OPRA.PILLAR.XMIO" => Ok(Self::OpraPillarXmio),
1313            "OPRA.PILLAR.ARCO" => Ok(Self::OpraPillarArco),
1314            "OPRA.PILLAR.OPRA" => Ok(Self::OpraPillarOpra),
1315            "OPRA.PILLAR.MPRL" => Ok(Self::OpraPillarMprl),
1316            "OPRA.PILLAR.XNDQ" => Ok(Self::OpraPillarXndq),
1317            "OPRA.PILLAR.XBXO" => Ok(Self::OpraPillarXbxo),
1318            "OPRA.PILLAR.C2OX" => Ok(Self::OpraPillarC2Ox),
1319            "OPRA.PILLAR.XPHL" => Ok(Self::OpraPillarXphl),
1320            "OPRA.PILLAR.BATO" => Ok(Self::OpraPillarBato),
1321            "OPRA.PILLAR.MXOP" => Ok(Self::OpraPillarMxop),
1322            "IEXG.TOPS.IEXG" => Ok(Self::IexgTopsIexg),
1323            "DBEQ.BASIC.XCHI" => Ok(Self::DbeqBasicXchi),
1324            "DBEQ.BASIC.XCIS" => Ok(Self::DbeqBasicXcis),
1325            "DBEQ.BASIC.IEXG" => Ok(Self::DbeqBasicIexg),
1326            "DBEQ.BASIC.EPRL" => Ok(Self::DbeqBasicEprl),
1327            "ARCX.PILLAR.ARCX" => Ok(Self::ArcxPillarArcx),
1328            "XNYS.BBO.XNYS" => Ok(Self::XnysBboXnys),
1329            "XNYS.TRADES.XNYS" => Ok(Self::XnysTradesXnys),
1330            "XNAS.QBBO.XNAS" => Ok(Self::XnasQbboXnas),
1331            "XNAS.NLS.XNAS" => Ok(Self::XnasNlsXnas),
1332            "EQUS.PLUS.XCHI" => Ok(Self::EqusPlusXchi),
1333            "EQUS.PLUS.XCIS" => Ok(Self::EqusPlusXcis),
1334            "EQUS.PLUS.IEXG" => Ok(Self::EqusPlusIexg),
1335            "EQUS.PLUS.EPRL" => Ok(Self::EqusPlusEprl),
1336            "EQUS.PLUS.XNAS" => Ok(Self::EqusPlusXnas),
1337            "EQUS.PLUS.XNYS" => Ok(Self::EqusPlusXnys),
1338            "EQUS.PLUS.FINN" => Ok(Self::EqusPlusFinn),
1339            "EQUS.PLUS.FINY" => Ok(Self::EqusPlusFiny),
1340            "EQUS.PLUS.FINC" => Ok(Self::EqusPlusFinc),
1341            "IFEU.IMPACT.IFEU" => Ok(Self::IfeuImpactIfeu),
1342            "NDEX.IMPACT.NDEX" => Ok(Self::NdexImpactNdex),
1343            "DBEQ.BASIC.DBEQ" => Ok(Self::DbeqBasicDbeq),
1344            "EQUS.PLUS.EQUS" => Ok(Self::EqusPlusEqus),
1345            "OPRA.PILLAR.SPHR" => Ok(Self::OpraPillarSphr),
1346            "EQUS.ALL.XCHI" => Ok(Self::EqusAllXchi),
1347            "EQUS.ALL.XCIS" => Ok(Self::EqusAllXcis),
1348            "EQUS.ALL.IEXG" => Ok(Self::EqusAllIexg),
1349            "EQUS.ALL.EPRL" => Ok(Self::EqusAllEprl),
1350            "EQUS.ALL.XNAS" => Ok(Self::EqusAllXnas),
1351            "EQUS.ALL.XNYS" => Ok(Self::EqusAllXnys),
1352            "EQUS.ALL.FINN" => Ok(Self::EqusAllFinn),
1353            "EQUS.ALL.FINY" => Ok(Self::EqusAllFiny),
1354            "EQUS.ALL.FINC" => Ok(Self::EqusAllFinc),
1355            "EQUS.ALL.BATS" => Ok(Self::EqusAllBats),
1356            "EQUS.ALL.BATY" => Ok(Self::EqusAllBaty),
1357            "EQUS.ALL.EDGA" => Ok(Self::EqusAllEdga),
1358            "EQUS.ALL.EDGX" => Ok(Self::EqusAllEdgx),
1359            "EQUS.ALL.XBOS" => Ok(Self::EqusAllXbos),
1360            "EQUS.ALL.XPSX" => Ok(Self::EqusAllXpsx),
1361            "EQUS.ALL.MEMX" => Ok(Self::EqusAllMemx),
1362            "EQUS.ALL.XASE" => Ok(Self::EqusAllXase),
1363            "EQUS.ALL.ARCX" => Ok(Self::EqusAllArcx),
1364            "EQUS.ALL.LTSE" => Ok(Self::EqusAllLtse),
1365            "XNAS.BASIC.XNAS" => Ok(Self::XnasBasicXnas),
1366            "XNAS.BASIC.FINN" => Ok(Self::XnasBasicFinn),
1367            "XNAS.BASIC.FINC" => Ok(Self::XnasBasicFinc),
1368            "IFEU.IMPACT.XOFF" => Ok(Self::IfeuImpactXoff),
1369            "NDEX.IMPACT.XOFF" => Ok(Self::NdexImpactXoff),
1370            "XNAS.NLS.XBOS" => Ok(Self::XnasNlsXbos),
1371            "XNAS.NLS.XPSX" => Ok(Self::XnasNlsXpsx),
1372            "XNAS.BASIC.XBOS" => Ok(Self::XnasBasicXbos),
1373            "XNAS.BASIC.XPSX" => Ok(Self::XnasBasicXpsx),
1374            "EQUS.SUMMARY.EQUS" => Ok(Self::EqusSummaryEqus),
1375            "XCIS.TRADESBBO.XCIS" => Ok(Self::XcisTradesbboXcis),
1376            "XNYS.TRADESBBO.XNYS" => Ok(Self::XnysTradesbboXnys),
1377            "XNAS.BASIC.EQUS" => Ok(Self::XnasBasicEqus),
1378            "EQUS.ALL.EQUS" => Ok(Self::EqusAllEqus),
1379            "EQUS.MINI.EQUS" => Ok(Self::EqusMiniEqus),
1380            "XNYS.TRADES.EQUS" => Ok(Self::XnysTradesEqus),
1381            "IFUS.IMPACT.IFUS" => Ok(Self::IfusImpactIfus),
1382            "IFUS.IMPACT.XOFF" => Ok(Self::IfusImpactXoff),
1383            "IFLL.IMPACT.IFLL" => Ok(Self::IfllImpactIfll),
1384            "IFLL.IMPACT.XOFF" => Ok(Self::IfllImpactXoff),
1385            "XEUR.EOBI.XEUR" => Ok(Self::XeurEobiXeur),
1386            "XEEE.EOBI.XEEE" => Ok(Self::XeeeEobiXeee),
1387            "XEUR.EOBI.XOFF" => Ok(Self::XeurEobiXoff),
1388            "XEEE.EOBI.XOFF" => Ok(Self::XeeeEobiXoff),
1389            "XCBF.PITCH.XCBF" => Ok(Self::XcbfPitchXcbf),
1390            "XCBF.PITCH.XOFF" => Ok(Self::XcbfPitchXoff),
1391            _ => Err(Error::conversion::<Self>(s)),
1392        }
1393    }
1394}
1395
1396#[cfg(feature = "serde")]
1397mod deserialize {
1398    use std::str::FromStr;
1399
1400    use serde::{de, Deserialize, Deserializer, Serialize};
1401
1402    use super::*;
1403
1404    impl<'de> Deserialize<'de> for Venue {
1405        fn deserialize<D: Deserializer<'de>>(
1406            deserializer: D,
1407        ) -> std::result::Result<Self, D::Error> {
1408            let str = String::deserialize(deserializer)?;
1409            FromStr::from_str(&str).map_err(de::Error::custom)
1410        }
1411    }
1412
1413    impl Serialize for Venue {
1414        fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
1415        where
1416            S: serde::Serializer,
1417        {
1418            self.as_str().serialize(serializer)
1419        }
1420    }
1421
1422    impl<'de> Deserialize<'de> for Dataset {
1423        fn deserialize<D: Deserializer<'de>>(
1424            deserializer: D,
1425        ) -> std::result::Result<Self, D::Error> {
1426            let str = String::deserialize(deserializer)?;
1427            FromStr::from_str(&str).map_err(de::Error::custom)
1428        }
1429    }
1430
1431    impl Serialize for Dataset {
1432        fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
1433        where
1434            S: serde::Serializer,
1435        {
1436            self.as_str().serialize(serializer)
1437        }
1438    }
1439
1440    impl<'de> Deserialize<'de> for Publisher {
1441        fn deserialize<D: Deserializer<'de>>(
1442            deserializer: D,
1443        ) -> std::result::Result<Self, D::Error> {
1444            let str = String::deserialize(deserializer)?;
1445            FromStr::from_str(&str).map_err(de::Error::custom)
1446        }
1447    }
1448
1449    impl Serialize for Publisher {
1450        fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
1451        where
1452            S: serde::Serializer,
1453        {
1454            self.as_str().serialize(serializer)
1455        }
1456    }
1457}
1458
1459#[cfg(feature = "python")]
1460mod python {
1461    use std::fmt::{self, Write};
1462
1463    use crate::python::WritePyRepr;
1464
1465    use super::*;
1466
1467    impl WritePyRepr for Publisher {
1468        fn write_py_repr(&self, s: &mut String) -> fmt::Result {
1469            write!(s, "{} ({:?})", self.as_str(), *self as u16)
1470        }
1471    }
1472}