1#![allow(clippy::new_without_default)]
3#![allow(clippy::needless_pass_by_value)]
4#![allow(clippy::too_many_arguments)]
5#![allow(unused_imports)]
6
7use fixer::message::Message;
8use fixer::fix_string::FIXString;
9use fixer::errors::MessageRejectErrorEnum;
10use fixer::session::session_id::SessionID;
11
12use rust_decimal::Decimal;
13
14
15use jiff::Timestamp;
16
17use crate::field;
18use crate::tag;
19
20pub struct TradingSessionStatus {
22 pub message: Message,
23}
24
25impl TradingSessionStatus {
26 pub fn new(trading_session_id: field::TradingSessionIDField, trad_ses_status: field::TradSesStatusField) -> Self {
28 let mut msg = Message::new();
29 msg.header.set_field(tag::MSG_TYPE, FIXString::from("h".to_string()));
30
31 msg.body.set_field(tag::TRADING_SESSION_ID, trading_session_id.0);
32
33 msg.body.set_field(tag::TRAD_SES_STATUS, trad_ses_status.0);
34
35 Self { message: msg }
36 }
37
38 pub fn from_message(msg: Message) -> Self {
40 Self { message: msg }
41 }
42
43 pub fn to_message(self) -> Message {
45 self.message
46 }
47
48
49
50
51 pub fn set_encoded_text(&mut self, v: String) {
53 self.message.body.set_field(tag::ENCODED_TEXT, FIXString::from(v));
54 }
55
56 pub fn get_encoded_text(&self) -> Result<String, MessageRejectErrorEnum> {
58 let mut fld = field::EncodedTextField::new(String::new());
59 self.message.body.get_field(tag::ENCODED_TEXT, &mut fld.0)?;
60 Ok(fld.value().to_string())
61 }
62
63
64 pub fn has_encoded_text(&self) -> bool {
66 self.message.body.has(tag::ENCODED_TEXT)
67 }
68
69
70
71
72 pub fn set_encoded_text_len(&mut self, v: isize) {
74 self.message.body.set_field(tag::ENCODED_TEXT_LEN, fixer::fix_int::FIXInt::from(v));
75 }
76
77 pub fn get_encoded_text_len(&self) -> Result<isize, MessageRejectErrorEnum> {
79 let mut fld = field::EncodedTextLenField::new(0);
80 self.message.body.get_field(tag::ENCODED_TEXT_LEN, &mut fld.0)?;
81 Ok(fld.value())
82 }
83
84
85 pub fn has_encoded_text_len(&self) -> bool {
87 self.message.body.has(tag::ENCODED_TEXT_LEN)
88 }
89
90
91
92
93 pub fn set_text(&mut self, v: String) {
95 self.message.body.set_field(tag::TEXT, FIXString::from(v));
96 }
97
98 pub fn get_text(&self) -> Result<String, MessageRejectErrorEnum> {
100 let mut fld = field::TextField::new(String::new());
101 self.message.body.get_field(tag::TEXT, &mut fld.0)?;
102 Ok(fld.value().to_string())
103 }
104
105
106 pub fn has_text(&self) -> bool {
108 self.message.body.has(tag::TEXT)
109 }
110
111
112
113
114 pub fn set_total_volume_traded(&mut self, val: Decimal, scale: i32) {
116 self.message.body.set_field(tag::TOTAL_VOLUME_TRADED, fixer::fix_decimal::FIXDecimal { decimal: val, scale });
117 }
118
119 pub fn get_total_volume_traded(&self) -> Result<Decimal, MessageRejectErrorEnum> {
121 let mut fld = field::TotalVolumeTradedField::new(Decimal::ZERO, 0);
122 self.message.body.get_field(tag::TOTAL_VOLUME_TRADED, &mut fld.0)?;
123 Ok(fld.value())
124 }
125
126
127 pub fn has_total_volume_traded(&self) -> bool {
129 self.message.body.has(tag::TOTAL_VOLUME_TRADED)
130 }
131
132
133
134
135 pub fn set_trad_ses_close_time(&mut self, v: Timestamp) {
137 self.message.body.set_field(tag::TRAD_SES_CLOSE_TIME, fixer::fix_utc_timestamp::FIXUTCTimestamp {
138 time: v,
139 precision: fixer::fix_utc_timestamp::TimestampPrecision::Millis,
140 });
141 }
142
143 pub fn get_trad_ses_close_time(&self) -> Result<Timestamp, MessageRejectErrorEnum> {
145 let mut fld = field::TradSesCloseTimeField::new(Timestamp::UNIX_EPOCH);
146 self.message.body.get_field(tag::TRAD_SES_CLOSE_TIME, &mut fld.0)?;
147 Ok(fld.value())
148 }
149
150
151 pub fn has_trad_ses_close_time(&self) -> bool {
153 self.message.body.has(tag::TRAD_SES_CLOSE_TIME)
154 }
155
156
157
158
159 pub fn set_trad_ses_end_time(&mut self, v: Timestamp) {
161 self.message.body.set_field(tag::TRAD_SES_END_TIME, fixer::fix_utc_timestamp::FIXUTCTimestamp {
162 time: v,
163 precision: fixer::fix_utc_timestamp::TimestampPrecision::Millis,
164 });
165 }
166
167 pub fn get_trad_ses_end_time(&self) -> Result<Timestamp, MessageRejectErrorEnum> {
169 let mut fld = field::TradSesEndTimeField::new(Timestamp::UNIX_EPOCH);
170 self.message.body.get_field(tag::TRAD_SES_END_TIME, &mut fld.0)?;
171 Ok(fld.value())
172 }
173
174
175 pub fn has_trad_ses_end_time(&self) -> bool {
177 self.message.body.has(tag::TRAD_SES_END_TIME)
178 }
179
180
181
182
183 pub fn set_trad_ses_method(&mut self, v: isize) {
185 self.message.body.set_field(tag::TRAD_SES_METHOD, fixer::fix_int::FIXInt::from(v));
186 }
187
188 pub fn get_trad_ses_method(&self) -> Result<isize, MessageRejectErrorEnum> {
190 let mut fld = field::TradSesMethodField::new(0);
191 self.message.body.get_field(tag::TRAD_SES_METHOD, &mut fld.0)?;
192 Ok(fld.value())
193 }
194
195
196 pub fn has_trad_ses_method(&self) -> bool {
198 self.message.body.has(tag::TRAD_SES_METHOD)
199 }
200
201
202
203
204 pub fn set_trad_ses_mode(&mut self, v: isize) {
206 self.message.body.set_field(tag::TRAD_SES_MODE, fixer::fix_int::FIXInt::from(v));
207 }
208
209 pub fn get_trad_ses_mode(&self) -> Result<isize, MessageRejectErrorEnum> {
211 let mut fld = field::TradSesModeField::new(0);
212 self.message.body.get_field(tag::TRAD_SES_MODE, &mut fld.0)?;
213 Ok(fld.value())
214 }
215
216
217 pub fn has_trad_ses_mode(&self) -> bool {
219 self.message.body.has(tag::TRAD_SES_MODE)
220 }
221
222
223
224
225 pub fn set_trad_ses_open_time(&mut self, v: Timestamp) {
227 self.message.body.set_field(tag::TRAD_SES_OPEN_TIME, fixer::fix_utc_timestamp::FIXUTCTimestamp {
228 time: v,
229 precision: fixer::fix_utc_timestamp::TimestampPrecision::Millis,
230 });
231 }
232
233 pub fn get_trad_ses_open_time(&self) -> Result<Timestamp, MessageRejectErrorEnum> {
235 let mut fld = field::TradSesOpenTimeField::new(Timestamp::UNIX_EPOCH);
236 self.message.body.get_field(tag::TRAD_SES_OPEN_TIME, &mut fld.0)?;
237 Ok(fld.value())
238 }
239
240
241 pub fn has_trad_ses_open_time(&self) -> bool {
243 self.message.body.has(tag::TRAD_SES_OPEN_TIME)
244 }
245
246
247
248
249 pub fn set_trad_ses_pre_close_time(&mut self, v: Timestamp) {
251 self.message.body.set_field(tag::TRAD_SES_PRE_CLOSE_TIME, fixer::fix_utc_timestamp::FIXUTCTimestamp {
252 time: v,
253 precision: fixer::fix_utc_timestamp::TimestampPrecision::Millis,
254 });
255 }
256
257 pub fn get_trad_ses_pre_close_time(&self) -> Result<Timestamp, MessageRejectErrorEnum> {
259 let mut fld = field::TradSesPreCloseTimeField::new(Timestamp::UNIX_EPOCH);
260 self.message.body.get_field(tag::TRAD_SES_PRE_CLOSE_TIME, &mut fld.0)?;
261 Ok(fld.value())
262 }
263
264
265 pub fn has_trad_ses_pre_close_time(&self) -> bool {
267 self.message.body.has(tag::TRAD_SES_PRE_CLOSE_TIME)
268 }
269
270
271
272
273 pub fn set_trad_ses_req_id(&mut self, v: String) {
275 self.message.body.set_field(tag::TRAD_SES_REQ_ID, FIXString::from(v));
276 }
277
278 pub fn get_trad_ses_req_id(&self) -> Result<String, MessageRejectErrorEnum> {
280 let mut fld = field::TradSesReqIDField::new(String::new());
281 self.message.body.get_field(tag::TRAD_SES_REQ_ID, &mut fld.0)?;
282 Ok(fld.value().to_string())
283 }
284
285
286 pub fn has_trad_ses_req_id(&self) -> bool {
288 self.message.body.has(tag::TRAD_SES_REQ_ID)
289 }
290
291
292
293
294 pub fn set_trad_ses_start_time(&mut self, v: Timestamp) {
296 self.message.body.set_field(tag::TRAD_SES_START_TIME, fixer::fix_utc_timestamp::FIXUTCTimestamp {
297 time: v,
298 precision: fixer::fix_utc_timestamp::TimestampPrecision::Millis,
299 });
300 }
301
302 pub fn get_trad_ses_start_time(&self) -> Result<Timestamp, MessageRejectErrorEnum> {
304 let mut fld = field::TradSesStartTimeField::new(Timestamp::UNIX_EPOCH);
305 self.message.body.get_field(tag::TRAD_SES_START_TIME, &mut fld.0)?;
306 Ok(fld.value())
307 }
308
309
310 pub fn has_trad_ses_start_time(&self) -> bool {
312 self.message.body.has(tag::TRAD_SES_START_TIME)
313 }
314
315
316
317
318 pub fn set_trad_ses_status(&mut self, v: isize) {
320 self.message.body.set_field(tag::TRAD_SES_STATUS, fixer::fix_int::FIXInt::from(v));
321 }
322
323 pub fn get_trad_ses_status(&self) -> Result<isize, MessageRejectErrorEnum> {
325 let mut fld = field::TradSesStatusField::new(0);
326 self.message.body.get_field(tag::TRAD_SES_STATUS, &mut fld.0)?;
327 Ok(fld.value())
328 }
329
330
331 pub fn has_trad_ses_status(&self) -> bool {
333 self.message.body.has(tag::TRAD_SES_STATUS)
334 }
335
336
337
338
339 pub fn set_trad_ses_status_rej_reason(&mut self, v: isize) {
341 self.message.body.set_field(tag::TRAD_SES_STATUS_REJ_REASON, fixer::fix_int::FIXInt::from(v));
342 }
343
344 pub fn get_trad_ses_status_rej_reason(&self) -> Result<isize, MessageRejectErrorEnum> {
346 let mut fld = field::TradSesStatusRejReasonField::new(0);
347 self.message.body.get_field(tag::TRAD_SES_STATUS_REJ_REASON, &mut fld.0)?;
348 Ok(fld.value())
349 }
350
351
352 pub fn has_trad_ses_status_rej_reason(&self) -> bool {
354 self.message.body.has(tag::TRAD_SES_STATUS_REJ_REASON)
355 }
356
357
358
359
360 pub fn set_trading_session_id(&mut self, v: String) {
362 self.message.body.set_field(tag::TRADING_SESSION_ID, FIXString::from(v));
363 }
364
365 pub fn get_trading_session_id(&self) -> Result<String, MessageRejectErrorEnum> {
367 let mut fld = field::TradingSessionIDField::new(String::new());
368 self.message.body.get_field(tag::TRADING_SESSION_ID, &mut fld.0)?;
369 Ok(fld.value().to_string())
370 }
371
372
373 pub fn has_trading_session_id(&self) -> bool {
375 self.message.body.has(tag::TRADING_SESSION_ID)
376 }
377
378
379
380
381 pub fn set_trading_session_sub_id(&mut self, v: String) {
383 self.message.body.set_field(tag::TRADING_SESSION_SUB_ID, FIXString::from(v));
384 }
385
386 pub fn get_trading_session_sub_id(&self) -> Result<String, MessageRejectErrorEnum> {
388 let mut fld = field::TradingSessionSubIDField::new(String::new());
389 self.message.body.get_field(tag::TRADING_SESSION_SUB_ID, &mut fld.0)?;
390 Ok(fld.value().to_string())
391 }
392
393
394 pub fn has_trading_session_sub_id(&self) -> bool {
396 self.message.body.has(tag::TRADING_SESSION_SUB_ID)
397 }
398
399
400
401
402 pub fn set_unsolicited_indicator(&mut self, v: bool) {
404 self.message.body.set_field(tag::UNSOLICITED_INDICATOR, fixer::fix_boolean::FIXBoolean::from(v));
405 }
406
407 pub fn get_unsolicited_indicator(&self) -> Result<bool, MessageRejectErrorEnum> {
409 let mut fld = field::UnsolicitedIndicatorField::new(false);
410 self.message.body.get_field(tag::UNSOLICITED_INDICATOR, &mut fld.0)?;
411 Ok(fld.value())
412 }
413
414
415 pub fn has_unsolicited_indicator(&self) -> bool {
417 self.message.body.has(tag::UNSOLICITED_INDICATOR)
418 }
419
420
421}
422
423pub type RouteOut = fn(msg: TradingSessionStatus, session_id: SessionID) -> Result<(), MessageRejectErrorEnum>;
425
426pub type Route = (&'static str, &'static str, Box<dyn Fn(&Message, SessionID) -> Result<(), MessageRejectErrorEnum> + Send>);
428
429pub fn route(router: RouteOut) -> Route {
431 let r = move |msg: &Message, session_id: SessionID| -> Result<(), MessageRejectErrorEnum> {
432 router(TradingSessionStatus::from_message(msg.clone()), session_id)
433 };
434 ("FIX.4.4", "h", Box::new(r))
435}