1#![allow(non_snake_case)]
2
3use std::fmt::Display;
4
5use crate::field_map::Tag;
6
7pub struct BeginString {}
8impl BeginString {
9 pub const FIXT11: &'static str = "FIXT.1.1";
10 pub const FIX50SP2: &'static str = "FIX.5.0SP2";
11 pub const FIX50SP1: &'static str = "FIX.5.0SP1";
12 pub const FIX50: &'static str = "FIX.5.0";
13 pub const FIX44: &'static str = "FIX.4.4";
14 pub const FIX43: &'static str = "FIX.4.3";
15 pub const FIX42: &'static str = "FIX.4.2";
16 pub const FIX41: &'static str = "FIX.4.1";
17 pub const FIX40: &'static str = "FIX.4.0";
18}
19
20pub enum ApplVerID {
21 FIX27,
22 FIX30,
23 FIX40,
24 FIX41,
25 FIX42,
26 FIX43,
27 FIX44,
28 FIX50,
29 FIX50SP1,
30 FIX50SP2,
31}
32
33impl Display for ApplVerID {
34 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35 let c = match self {
36 ApplVerID::FIX27 => "0",
37 ApplVerID::FIX30 => "1",
38 ApplVerID::FIX40 => "2",
39 ApplVerID::FIX41 => "3",
40 ApplVerID::FIX42 => "4",
41 ApplVerID::FIX43 => "5",
42 ApplVerID::FIX44 => "6",
43 ApplVerID::FIX50 => "7",
44 ApplVerID::FIX50SP1 => "8",
45 ApplVerID::FIX50SP2 => "9",
46 };
47 f.write_str(c)
48 }
49}
50
51impl ApplVerID {
52 pub fn from_begin_string(begin_string: &str) -> &str {
53 if BeginString::FIX40 == begin_string {
54 return ApplVerID::FIX40.as_str();
55 } else if BeginString::FIX41 == begin_string {
56 return ApplVerID::FIX41.as_str();
57 } else if BeginString::FIX42 == begin_string {
58 return ApplVerID::FIX42.as_str();
59 }
60 else if BeginString::FIX43 == begin_string {
61 return ApplVerID::FIX43.as_str();
62 }
63 else if BeginString::FIX44 == begin_string {
64 return ApplVerID::FIX44.as_str();
65 }
66 else if BeginString::FIX50 == begin_string {
67 return ApplVerID::FIX50.as_str();
68 }
69 else if BeginString::FIX50SP1 == begin_string {
70 return ApplVerID::FIX50SP1.as_str();
71 }
72 else if BeginString::FIX50SP2 == begin_string {
73 return ApplVerID::FIX50SP2.as_str();
74 }
75 else {
76 return begin_string;
77 }
78 }
79
80 pub fn as_str(&self) -> &str {
81 match self {
82 ApplVerID::FIX27 => "0",
83 ApplVerID::FIX30 => "1",
84 ApplVerID::FIX40 => "2",
85 ApplVerID::FIX41 => "3",
86 ApplVerID::FIX42 => "4",
87 ApplVerID::FIX43 => "5",
88 ApplVerID::FIX44 => "6",
89 ApplVerID::FIX50 => "7",
90 ApplVerID::FIX50SP1 => "8",
91 ApplVerID::FIX50SP2 => "9",
92 }
93 }
94}
95
96#[derive(Clone, Debug, PartialEq, Eq)]
97pub struct SessionRejectReason {
98 tag: Tag,
99 reason: String,
100}
101
102impl SessionRejectReason {
103 pub fn INVALID_TAG_NUMBER() -> SessionRejectReason { SessionRejectReason { tag: 0, reason: "Invalid tag number".to_string() } }
104 pub fn REQUIRED_TAG_MISSING() -> SessionRejectReason { SessionRejectReason { tag: 1, reason: "Required tag missing".to_string() } }
105 pub fn TAG_NOT_DEFINED_FOR_THIS_MESSAGE_TYPE() -> SessionRejectReason { SessionRejectReason { tag: 2, reason: "Tag not defined for this message type".to_string() } }
106 pub fn UNDEFINED_TAG() -> SessionRejectReason { SessionRejectReason { tag: 3, reason: "Undefined Tag".to_string() } }
107 pub fn TAG_SPECIFIED_WITHOUT_A_VALUE() -> SessionRejectReason { SessionRejectReason { tag: 4, reason: "Tag specified without a value".to_string() } }
108 pub fn VALUE_IS_INCORRECT() -> SessionRejectReason { SessionRejectReason { tag: 5, reason: "Value is incorrect (out of range) for this tag".to_string() } }
109 pub fn INCORRECT_DATA_FORMAT_FOR_VALUE() -> SessionRejectReason { SessionRejectReason { tag: 6, reason: "Incorrect data format for value".to_string() } }
110 pub fn DECRYPTION_PROBLEM() -> SessionRejectReason { SessionRejectReason { tag: 7, reason: "Decryption problem".to_string() } }
111 pub fn SIGNATURE_PROBLEM() -> SessionRejectReason { SessionRejectReason { tag: 8, reason: "Signature problem".to_string() } }
112 pub fn COMPID_PROBLEM() -> SessionRejectReason { SessionRejectReason { tag: 9, reason: "CompID problem".to_string() } }
113 pub fn SENDING_TIME_ACCURACY_PROBLEM() -> SessionRejectReason { SessionRejectReason { tag: 10, reason: "SendingTime accuracy problem".to_string() } }
114 pub fn INVALID_MSGTYPE() -> SessionRejectReason { SessionRejectReason { tag: 11, reason: "Invalid MsgType".to_string() } }
115 pub fn XML_VALIDATION_ERROR() -> SessionRejectReason { SessionRejectReason { tag: 12, reason: "XML validation error".to_string() } }
116 pub fn TAG_APPEARS_MORE_THAN_ONCE() -> SessionRejectReason { SessionRejectReason { tag: 13, reason: "Tag appears more than once".to_string() } }
117 pub fn TAG_SPECIFIED_OUT_OF_REQUIRED_ORDER() -> SessionRejectReason { SessionRejectReason { tag: 14, reason: "Tag specified out of required order".to_string() } }
118 pub fn REPEATING_GROUP_FIELDS_OUT_OF_ORDER() -> SessionRejectReason { SessionRejectReason { tag: 15, reason: "Repeating group fields out of order".to_string() } }
119 pub fn INCORRECT_NUM_IN_GROUP_COUNT_FOR_REPEATING_GROUP() -> SessionRejectReason { SessionRejectReason { tag: 16, reason: "Incorrect NumInGroup count for repeating group".to_string() } }
120 pub fn NON_DATA_VALUE_INCLUDES_FIELD_DELIMITER() -> SessionRejectReason { SessionRejectReason { tag: 17, reason: "Non-data value includes field delimiter".to_string() } }
121 pub fn OTHER(reason: String) -> SessionRejectReason { SessionRejectReason { tag: 99, reason } }
122
123 pub fn tag(&self) -> Tag {
124 self.tag
125 }
126
127 pub fn reason(&self) -> &str {
128 self.reason.as_ref()
129 }
130
131 pub fn description(&self) -> String {
132 format!("{}", self.reason)
133 }
134}
135
136#[derive(Clone, Debug, PartialEq, Eq)]
137pub struct BusinessRejectReason {
138 index: usize,
139 reason: String,
140}
141
142impl BusinessRejectReason {
143 pub fn UNKNOWN_MESSAGE_TYPE() -> BusinessRejectReason { BusinessRejectReason { index: 3, reason: "Unsupported Message Type".to_string() } }
144
145 pub fn index(&self) -> usize {
146 self.index
147 }
148
149 pub fn reason(&self) -> &str {
150 self.reason.as_ref()
151 }
152
153 pub fn description(&self) -> String {
154 format!("{}", self.reason)
155 }
156}