nautilus_model/identifiers/
venue.rs1use std::{
19 fmt::{Debug, Display, Formatter},
20 hash::Hash,
21};
22
23use nautilus_core::correctness::{FAILED, check_valid_string};
24use ustr::Ustr;
25
26use crate::venues::VENUE_MAP;
27
28pub const SYNTHETIC_VENUE: &str = "SYNTH";
29
30#[repr(C)]
32#[derive(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
33#[cfg_attr(
34 feature = "python",
35 pyo3::pyclass(module = "posei_trader.core.nautilus_pyo3.model")
36)]
37pub struct Venue(Ustr);
38
39impl Venue {
40 pub fn new_checked<T: AsRef<str>>(value: T) -> anyhow::Result<Self> {
50 let value = value.as_ref();
51 check_valid_string(value, stringify!(value))?;
52 Ok(Self(Ustr::from(value)))
53 }
54
55 pub fn new<T: AsRef<str>>(value: T) -> Self {
61 Self::new_checked(value).expect(FAILED)
62 }
63
64 #[allow(dead_code)]
66 pub(crate) fn set_inner(&mut self, value: &str) {
67 self.0 = Ustr::from(value);
68 }
69
70 #[must_use]
72 pub fn inner(&self) -> Ustr {
73 self.0
74 }
75
76 #[must_use]
78 pub fn as_str(&self) -> &str {
79 self.0.as_str()
80 }
81
82 #[must_use]
83 pub fn from_str_unchecked<T: AsRef<str>>(s: T) -> Self {
84 Self(Ustr::from(s.as_ref()))
85 }
86
87 #[must_use]
88 pub const fn from_ustr_unchecked(s: Ustr) -> Self {
89 Self(s)
90 }
91
92 pub fn from_code(code: &str) -> anyhow::Result<Self> {
96 let map_guard = VENUE_MAP
97 .lock()
98 .map_err(|e| anyhow::anyhow!("Error acquiring lock on `VENUE_MAP`: {e}"))?;
99 map_guard
100 .get(code)
101 .copied()
102 .ok_or_else(|| anyhow::anyhow!("Unknown venue code: {code}"))
103 }
104
105 #[must_use]
106 pub fn synthetic() -> Self {
107 Self::new(SYNTHETIC_VENUE)
109 }
110
111 #[must_use]
112 pub fn is_synthetic(&self) -> bool {
113 self.0.as_str() == SYNTHETIC_VENUE
114 }
115}
116
117impl Debug for Venue {
118 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
119 write!(f, "{:?}", self.0)
120 }
121}
122
123impl Display for Venue {
124 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
125 write!(f, "{}", self.0)
126 }
127}
128
129#[cfg(test)]
133mod tests {
134 use rstest::rstest;
135
136 use crate::identifiers::{Venue, stubs::*};
137
138 #[rstest]
139 fn test_string_reprs(venue_binance: Venue) {
140 assert_eq!(venue_binance.as_str(), "BINANCE");
141 assert_eq!(format!("{venue_binance}"), "BINANCE");
142 }
143}