Skip to main content

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