1#![cfg_attr(not(feature = "std"), no_std)]
56#![cfg_attr(docsrs, feature(doc_cfg))]
57#![warn(missing_docs)]
58#![warn(rust_2018_idioms)]
59#![cfg_attr(not(feature = "simd"), forbid(unsafe_code))]
60
61pub mod fields;
63pub mod spec;
64
65#[cfg(feature = "std")]
67pub mod field;
68
69#[cfg(feature = "alloc")]
70pub mod bitmap_simd;
71
72#[cfg(feature = "alloc")]
73pub use bitmap_simd as bitmap;
74
75#[cfg(feature = "std")]
77pub mod error;
78
79#[cfg(feature = "std")]
80pub mod mti;
81
82#[cfg(feature = "std")]
83pub mod encoding;
84
85#[cfg(feature = "std")]
86pub mod validation;
87
88#[cfg(feature = "std")]
89pub mod response_code;
90
91#[cfg(feature = "std")]
92pub mod processing_code;
93
94#[cfg(feature = "std")]
95pub mod utils;
96
97#[cfg(feature = "std")]
98pub mod message;
99
100pub use fields::IsoField;
102pub use spec::{DataType, FieldDefinition, Iso1987, IsoSpec, LengthType};
103
104#[cfg(feature = "alloc")]
105pub use bitmap::Bitmap;
106
107#[cfg(feature = "std")]
108pub use error::{ISO8583Error, Result};
109
110#[cfg(feature = "std")]
111pub use mti::{MessageClass, MessageFunction, MessageOrigin, MessageType};
112
113#[cfg(feature = "std")]
114pub use message::{ISO8583Message, MessageBuilder};
115
116#[cfg(feature = "std")]
117pub use response_code::{ResponseCategory, ResponseCode};
118
119#[cfg(feature = "std")]
120pub use processing_code::{AccountType, ProcessingCode, TransactionType};
121
122#[cfg(feature = "std")]
123pub use validation::Validator;
124
125#[cfg(feature = "std")]
127pub use crate::field::Field;
128
129#[cfg(test)]
130mod tests {
131 use super::*;
132
133 #[test]
134 fn test_spec_lookup() {
135 let field2 = Iso1987::get_field(2).unwrap();
137 assert_eq!(field2.data_type, DataType::Numeric);
138 assert_eq!(field2.length_type, LengthType::Llvar);
139 }
140
141 #[cfg(feature = "alloc")]
142 #[test]
143 fn test_bitmap() {
144 let mut bitmap = Bitmap::new();
145 bitmap.set(2).unwrap();
146 assert!(bitmap.is_set(2));
147 }
148
149 #[cfg(feature = "std")]
150 #[test]
151 fn test_message_roundtrip() {
152 let message = ISO8583Message::builder()
153 .mti(MessageType::AUTHORIZATION_REQUEST)
154 .field(Field::PrimaryAccountNumber, "4111111111111111")
155 .field(Field::ProcessingCode, "000000")
156 .field(Field::TransactionAmount, "000000010000")
157 .field(Field::SystemTraceAuditNumber, "123456")
158 .field(Field::LocalTransactionTime, "120000")
159 .field(Field::LocalTransactionDate, "0219")
160 .build()
161 .unwrap();
162
163 let bytes = message.to_bytes();
164 let parsed = ISO8583Message::from_bytes(&bytes).unwrap();
165
166 assert_eq!(parsed.mti, MessageType::AUTHORIZATION_REQUEST);
167 }
168}