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 Allocation {
22 pub message: Message,
23}
24
25impl Allocation {
26 pub fn new(alloc_id: field::AllocIDField, alloc_trans_type: field::AllocTransTypeField, no_orders: field::NoOrdersField, side: field::SideField, symbol: field::SymbolField, shares: field::SharesField, avg_px: field::AvgPxField, trade_date: field::TradeDateField, no_allocs: field::NoAllocsField) -> Self {
28 let mut msg = Message::new();
29 msg.header.set_field(tag::MSG_TYPE, FIXString::from("J".to_string()));
30
31 msg.body.set_field(tag::ALLOC_ID, alloc_id.0);
32
33 msg.body.set_field(tag::ALLOC_TRANS_TYPE, alloc_trans_type.0);
34
35 msg.body.set_field(tag::NO_ORDERS, no_orders.0);
36
37 msg.body.set_field(tag::SIDE, side.0);
38
39 msg.body.set_field(tag::SYMBOL, symbol.0);
40
41 msg.body.set_field(tag::SHARES, shares.0);
42
43 msg.body.set_field(tag::AVG_PX, avg_px.0);
44
45 msg.body.set_field(tag::TRADE_DATE, trade_date.0);
46
47 msg.body.set_field(tag::NO_ALLOCS, no_allocs.0);
48
49 Self { message: msg }
50 }
51
52 pub fn from_message(msg: Message) -> Self {
54 Self { message: msg }
55 }
56
57 pub fn to_message(self) -> Message {
59 self.message
60 }
61
62
63
64
65 pub fn set_alloc_id(&mut self, v: String) {
67 self.message.body.set_field(tag::ALLOC_ID, FIXString::from(v));
68 }
69
70 pub fn get_alloc_id(&self) -> Result<String, MessageRejectErrorEnum> {
72 let mut fld = field::AllocIDField::new(String::new());
73 self.message.body.get_field(tag::ALLOC_ID, &mut fld.0)?;
74 Ok(fld.value().to_string())
75 }
76
77
78 pub fn has_alloc_id(&self) -> bool {
80 self.message.body.has(tag::ALLOC_ID)
81 }
82
83
84
85
86 pub fn set_alloc_trans_type(&mut self, v: String) {
88 self.message.body.set_field(tag::ALLOC_TRANS_TYPE, FIXString::from(v));
89 }
90
91 pub fn get_alloc_trans_type(&self) -> Result<String, MessageRejectErrorEnum> {
93 let mut fld = field::AllocTransTypeField::new(String::new());
94 self.message.body.get_field(tag::ALLOC_TRANS_TYPE, &mut fld.0)?;
95 Ok(fld.value().to_string())
96 }
97
98
99 pub fn has_alloc_trans_type(&self) -> bool {
101 self.message.body.has(tag::ALLOC_TRANS_TYPE)
102 }
103
104
105
106
107 pub fn set_avg_prx_precision(&mut self, v: isize) {
109 self.message.body.set_field(tag::AVG_PRX_PRECISION, fixer::fix_int::FIXInt::from(v));
110 }
111
112 pub fn get_avg_prx_precision(&self) -> Result<isize, MessageRejectErrorEnum> {
114 let mut fld = field::AvgPrxPrecisionField::new(0);
115 self.message.body.get_field(tag::AVG_PRX_PRECISION, &mut fld.0)?;
116 Ok(fld.value())
117 }
118
119
120 pub fn has_avg_prx_precision(&self) -> bool {
122 self.message.body.has(tag::AVG_PRX_PRECISION)
123 }
124
125
126
127
128 pub fn set_avg_px(&mut self, val: Decimal, scale: i32) {
130 self.message.body.set_field(tag::AVG_PX, fixer::fix_decimal::FIXDecimal { decimal: val, scale });
131 }
132
133 pub fn get_avg_px(&self) -> Result<Decimal, MessageRejectErrorEnum> {
135 let mut fld = field::AvgPxField::new(Decimal::ZERO, 0);
136 self.message.body.get_field(tag::AVG_PX, &mut fld.0)?;
137 Ok(fld.value())
138 }
139
140
141 pub fn has_avg_px(&self) -> bool {
143 self.message.body.has(tag::AVG_PX)
144 }
145
146
147
148
149 pub fn set_currency(&mut self, v: String) {
151 self.message.body.set_field(tag::CURRENCY, FIXString::from(v));
152 }
153
154 pub fn get_currency(&self) -> Result<String, MessageRejectErrorEnum> {
156 let mut fld = field::CurrencyField::new(String::new());
157 self.message.body.get_field(tag::CURRENCY, &mut fld.0)?;
158 Ok(fld.value().to_string())
159 }
160
161
162 pub fn has_currency(&self) -> bool {
164 self.message.body.has(tag::CURRENCY)
165 }
166
167
168
169
170 pub fn set_fut_sett_date(&mut self, v: String) {
172 self.message.body.set_field(tag::FUT_SETT_DATE, FIXString::from(v));
173 }
174
175 pub fn get_fut_sett_date(&self) -> Result<String, MessageRejectErrorEnum> {
177 let mut fld = field::FutSettDateField::new(String::new());
178 self.message.body.get_field(tag::FUT_SETT_DATE, &mut fld.0)?;
179 Ok(fld.value().to_string())
180 }
181
182
183 pub fn has_fut_sett_date(&self) -> bool {
185 self.message.body.has(tag::FUT_SETT_DATE)
186 }
187
188
189
190
191 pub fn set_id_source(&mut self, v: String) {
193 self.message.body.set_field(tag::ID_SOURCE, FIXString::from(v));
194 }
195
196 pub fn get_id_source(&self) -> Result<String, MessageRejectErrorEnum> {
198 let mut fld = field::IDSourceField::new(String::new());
199 self.message.body.get_field(tag::ID_SOURCE, &mut fld.0)?;
200 Ok(fld.value().to_string())
201 }
202
203
204 pub fn has_id_source(&self) -> bool {
206 self.message.body.has(tag::ID_SOURCE)
207 }
208
209
210
211
212 pub fn set_issuer(&mut self, v: String) {
214 self.message.body.set_field(tag::ISSUER, FIXString::from(v));
215 }
216
217 pub fn get_issuer(&self) -> Result<String, MessageRejectErrorEnum> {
219 let mut fld = field::IssuerField::new(String::new());
220 self.message.body.get_field(tag::ISSUER, &mut fld.0)?;
221 Ok(fld.value().to_string())
222 }
223
224
225 pub fn has_issuer(&self) -> bool {
227 self.message.body.has(tag::ISSUER)
228 }
229
230
231
232
233 pub fn set_net_money(&mut self, val: Decimal, scale: i32) {
235 self.message.body.set_field(tag::NET_MONEY, fixer::fix_decimal::FIXDecimal { decimal: val, scale });
236 }
237
238 pub fn get_net_money(&self) -> Result<Decimal, MessageRejectErrorEnum> {
240 let mut fld = field::NetMoneyField::new(Decimal::ZERO, 0);
241 self.message.body.get_field(tag::NET_MONEY, &mut fld.0)?;
242 Ok(fld.value())
243 }
244
245
246 pub fn has_net_money(&self) -> bool {
248 self.message.body.has(tag::NET_MONEY)
249 }
250
251
252
253
254 pub fn set_no_allocs(&mut self, v: isize) {
256 self.message.body.set_field(tag::NO_ALLOCS, fixer::fix_int::FIXInt::from(v));
257 }
258
259 pub fn get_no_allocs(&self) -> Result<isize, MessageRejectErrorEnum> {
261 let mut fld = field::NoAllocsField::new(0);
262 self.message.body.get_field(tag::NO_ALLOCS, &mut fld.0)?;
263 Ok(fld.value())
264 }
265
266
267 pub fn has_no_allocs(&self) -> bool {
269 self.message.body.has(tag::NO_ALLOCS)
270 }
271
272
273
274
275 pub fn set_no_execs(&mut self, v: isize) {
277 self.message.body.set_field(tag::NO_EXECS, fixer::fix_int::FIXInt::from(v));
278 }
279
280 pub fn get_no_execs(&self) -> Result<isize, MessageRejectErrorEnum> {
282 let mut fld = field::NoExecsField::new(0);
283 self.message.body.get_field(tag::NO_EXECS, &mut fld.0)?;
284 Ok(fld.value())
285 }
286
287
288 pub fn has_no_execs(&self) -> bool {
290 self.message.body.has(tag::NO_EXECS)
291 }
292
293
294
295
296 pub fn set_no_misc_fees(&mut self, v: isize) {
298 self.message.body.set_field(tag::NO_MISC_FEES, fixer::fix_int::FIXInt::from(v));
299 }
300
301 pub fn get_no_misc_fees(&self) -> Result<isize, MessageRejectErrorEnum> {
303 let mut fld = field::NoMiscFeesField::new(0);
304 self.message.body.get_field(tag::NO_MISC_FEES, &mut fld.0)?;
305 Ok(fld.value())
306 }
307
308
309 pub fn has_no_misc_fees(&self) -> bool {
311 self.message.body.has(tag::NO_MISC_FEES)
312 }
313
314
315
316
317 pub fn set_no_orders(&mut self, v: isize) {
319 self.message.body.set_field(tag::NO_ORDERS, fixer::fix_int::FIXInt::from(v));
320 }
321
322 pub fn get_no_orders(&self) -> Result<isize, MessageRejectErrorEnum> {
324 let mut fld = field::NoOrdersField::new(0);
325 self.message.body.get_field(tag::NO_ORDERS, &mut fld.0)?;
326 Ok(fld.value())
327 }
328
329
330 pub fn has_no_orders(&self) -> bool {
332 self.message.body.has(tag::NO_ORDERS)
333 }
334
335
336
337
338 pub fn set_open_close(&mut self, v: String) {
340 self.message.body.set_field(tag::OPEN_CLOSE, FIXString::from(v));
341 }
342
343 pub fn get_open_close(&self) -> Result<String, MessageRejectErrorEnum> {
345 let mut fld = field::OpenCloseField::new(String::new());
346 self.message.body.get_field(tag::OPEN_CLOSE, &mut fld.0)?;
347 Ok(fld.value().to_string())
348 }
349
350
351 pub fn has_open_close(&self) -> bool {
353 self.message.body.has(tag::OPEN_CLOSE)
354 }
355
356
357
358
359 pub fn set_ref_alloc_id(&mut self, v: String) {
361 self.message.body.set_field(tag::REF_ALLOC_ID, FIXString::from(v));
362 }
363
364 pub fn get_ref_alloc_id(&self) -> Result<String, MessageRejectErrorEnum> {
366 let mut fld = field::RefAllocIDField::new(String::new());
367 self.message.body.get_field(tag::REF_ALLOC_ID, &mut fld.0)?;
368 Ok(fld.value().to_string())
369 }
370
371
372 pub fn has_ref_alloc_id(&self) -> bool {
374 self.message.body.has(tag::REF_ALLOC_ID)
375 }
376
377
378
379
380 pub fn set_security_desc(&mut self, v: String) {
382 self.message.body.set_field(tag::SECURITY_DESC, FIXString::from(v));
383 }
384
385 pub fn get_security_desc(&self) -> Result<String, MessageRejectErrorEnum> {
387 let mut fld = field::SecurityDescField::new(String::new());
388 self.message.body.get_field(tag::SECURITY_DESC, &mut fld.0)?;
389 Ok(fld.value().to_string())
390 }
391
392
393 pub fn has_security_desc(&self) -> bool {
395 self.message.body.has(tag::SECURITY_DESC)
396 }
397
398
399
400
401 pub fn set_security_id(&mut self, v: String) {
403 self.message.body.set_field(tag::SECURITY_ID, FIXString::from(v));
404 }
405
406 pub fn get_security_id(&self) -> Result<String, MessageRejectErrorEnum> {
408 let mut fld = field::SecurityIDField::new(String::new());
409 self.message.body.get_field(tag::SECURITY_ID, &mut fld.0)?;
410 Ok(fld.value().to_string())
411 }
412
413
414 pub fn has_security_id(&self) -> bool {
416 self.message.body.has(tag::SECURITY_ID)
417 }
418
419
420
421
422 pub fn set_settl_curr_amt(&mut self, val: Decimal, scale: i32) {
424 self.message.body.set_field(tag::SETTL_CURR_AMT, fixer::fix_decimal::FIXDecimal { decimal: val, scale });
425 }
426
427 pub fn get_settl_curr_amt(&self) -> Result<Decimal, MessageRejectErrorEnum> {
429 let mut fld = field::SettlCurrAmtField::new(Decimal::ZERO, 0);
430 self.message.body.get_field(tag::SETTL_CURR_AMT, &mut fld.0)?;
431 Ok(fld.value())
432 }
433
434
435 pub fn has_settl_curr_amt(&self) -> bool {
437 self.message.body.has(tag::SETTL_CURR_AMT)
438 }
439
440
441
442
443 pub fn set_settl_currency(&mut self, v: String) {
445 self.message.body.set_field(tag::SETTL_CURRENCY, FIXString::from(v));
446 }
447
448 pub fn get_settl_currency(&self) -> Result<String, MessageRejectErrorEnum> {
450 let mut fld = field::SettlCurrencyField::new(String::new());
451 self.message.body.get_field(tag::SETTL_CURRENCY, &mut fld.0)?;
452 Ok(fld.value().to_string())
453 }
454
455
456 pub fn has_settl_currency(&self) -> bool {
458 self.message.body.has(tag::SETTL_CURRENCY)
459 }
460
461
462
463
464 pub fn set_settlmnt_typ(&mut self, v: String) {
466 self.message.body.set_field(tag::SETTLMNT_TYP, FIXString::from(v));
467 }
468
469 pub fn get_settlmnt_typ(&self) -> Result<String, MessageRejectErrorEnum> {
471 let mut fld = field::SettlmntTypField::new(String::new());
472 self.message.body.get_field(tag::SETTLMNT_TYP, &mut fld.0)?;
473 Ok(fld.value().to_string())
474 }
475
476
477 pub fn has_settlmnt_typ(&self) -> bool {
479 self.message.body.has(tag::SETTLMNT_TYP)
480 }
481
482
483
484
485 pub fn set_shares(&mut self, val: Decimal, scale: i32) {
487 self.message.body.set_field(tag::SHARES, fixer::fix_decimal::FIXDecimal { decimal: val, scale });
488 }
489
490 pub fn get_shares(&self) -> Result<Decimal, MessageRejectErrorEnum> {
492 let mut fld = field::SharesField::new(Decimal::ZERO, 0);
493 self.message.body.get_field(tag::SHARES, &mut fld.0)?;
494 Ok(fld.value())
495 }
496
497
498 pub fn has_shares(&self) -> bool {
500 self.message.body.has(tag::SHARES)
501 }
502
503
504
505
506 pub fn set_side(&mut self, v: String) {
508 self.message.body.set_field(tag::SIDE, FIXString::from(v));
509 }
510
511 pub fn get_side(&self) -> Result<String, MessageRejectErrorEnum> {
513 let mut fld = field::SideField::new(String::new());
514 self.message.body.get_field(tag::SIDE, &mut fld.0)?;
515 Ok(fld.value().to_string())
516 }
517
518
519 pub fn has_side(&self) -> bool {
521 self.message.body.has(tag::SIDE)
522 }
523
524
525
526
527 pub fn set_symbol(&mut self, v: String) {
529 self.message.body.set_field(tag::SYMBOL, FIXString::from(v));
530 }
531
532 pub fn get_symbol(&self) -> Result<String, MessageRejectErrorEnum> {
534 let mut fld = field::SymbolField::new(String::new());
535 self.message.body.get_field(tag::SYMBOL, &mut fld.0)?;
536 Ok(fld.value().to_string())
537 }
538
539
540 pub fn has_symbol(&self) -> bool {
542 self.message.body.has(tag::SYMBOL)
543 }
544
545
546
547
548 pub fn set_symbol_sfx(&mut self, v: String) {
550 self.message.body.set_field(tag::SYMBOL_SFX, FIXString::from(v));
551 }
552
553 pub fn get_symbol_sfx(&self) -> Result<String, MessageRejectErrorEnum> {
555 let mut fld = field::SymbolSfxField::new(String::new());
556 self.message.body.get_field(tag::SYMBOL_SFX, &mut fld.0)?;
557 Ok(fld.value().to_string())
558 }
559
560
561 pub fn has_symbol_sfx(&self) -> bool {
563 self.message.body.has(tag::SYMBOL_SFX)
564 }
565
566
567
568
569 pub fn set_text(&mut self, v: String) {
571 self.message.body.set_field(tag::TEXT, FIXString::from(v));
572 }
573
574 pub fn get_text(&self) -> Result<String, MessageRejectErrorEnum> {
576 let mut fld = field::TextField::new(String::new());
577 self.message.body.get_field(tag::TEXT, &mut fld.0)?;
578 Ok(fld.value().to_string())
579 }
580
581
582 pub fn has_text(&self) -> bool {
584 self.message.body.has(tag::TEXT)
585 }
586
587
588
589
590 pub fn set_trade_date(&mut self, v: String) {
592 self.message.body.set_field(tag::TRADE_DATE, FIXString::from(v));
593 }
594
595 pub fn get_trade_date(&self) -> Result<String, MessageRejectErrorEnum> {
597 let mut fld = field::TradeDateField::new(String::new());
598 self.message.body.get_field(tag::TRADE_DATE, &mut fld.0)?;
599 Ok(fld.value().to_string())
600 }
601
602
603 pub fn has_trade_date(&self) -> bool {
605 self.message.body.has(tag::TRADE_DATE)
606 }
607
608
609
610
611 pub fn set_transact_time(&mut self, v: Timestamp) {
613 self.message.body.set_field(tag::TRANSACT_TIME, fixer::fix_utc_timestamp::FIXUTCTimestamp {
614 time: v,
615 precision: fixer::fix_utc_timestamp::TimestampPrecision::Millis,
616 });
617 }
618
619 pub fn get_transact_time(&self) -> Result<Timestamp, MessageRejectErrorEnum> {
621 let mut fld = field::TransactTimeField::new(Timestamp::UNIX_EPOCH);
622 self.message.body.get_field(tag::TRANSACT_TIME, &mut fld.0)?;
623 Ok(fld.value())
624 }
625
626
627 pub fn has_transact_time(&self) -> bool {
629 self.message.body.has(tag::TRANSACT_TIME)
630 }
631
632
633}
634
635pub type RouteOut = fn(msg: Allocation, session_id: SessionID) -> Result<(), MessageRejectErrorEnum>;
637
638pub type Route = (&'static str, &'static str, Box<dyn Fn(&Message, SessionID) -> Result<(), MessageRejectErrorEnum> + Send>);
640
641pub fn route(router: RouteOut) -> Route {
643 let r = move |msg: &Message, session_id: SessionID| -> Result<(), MessageRejectErrorEnum> {
644 router(Allocation::from_message(msg.clone()), session_id)
645 };
646 ("FIX.4.0", "J", Box::new(r))
647}