edifact_types/d95b/segment.rs
1use super::*;
2use crate::util::{clean_num, Parser};
3use edifact_types_macros::{DisplayOuterSegment, ParseSegment};
4use nom::{bytes::complete::take_until, character::complete::not_line_ending, IResult};
5use serde::{Deserialize, Serialize};
6use std::{
7 fmt::{self, Debug},
8 str::FromStr,
9};
10/// BGM - BEGINNING OF MESSAGE
11///
12/// To indicate the type and function of a message and to
13/// transmit the identifying number.
14#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
15pub struct BGM {
16 pub _010: Option<C002>,
17 /// 1004 - Document/message number
18 ///
19 /// Reference number assigned to the document/message by the issuer.
20 /// an..35
21 pub _020: Option<String>,
22 pub _030: Option<_1225>,
23 pub _040: Option<_4343>,
24}
25
26/// CNT - CONTROL TOTAL
27///
28/// To provide control total.
29#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
30pub struct CNT {
31 /// CONTROL
32 pub _010: C270,
33}
34
35/// CTA CONTACT INFORMATION
36///
37/// To identify a person or a department to whom
38/// communication should be directed.
39#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
40pub struct CTA {
41 /// CONTACT FUNCTION, CODED
42 ///
43 /// C an..3
44 pub _010: Option<String>,
45 /// DEPARTMENT OR EMPLOYEE DETAILS
46 pub _020: Option<C056>,
47}
48
49/// DGS - DANGEROUS GOODS
50///
51/// To identify dangerous goods.
52#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
53pub struct DGS {
54 /// DANGEROUS GOODS REGULATIONS, CODED
55 ///
56 /// C an..3
57 pub _010: Option<String>,
58 /// HAZARD CODE
59 pub _020: Option<C205>,
60 /// UNDG INFORMATION
61 pub _030: Option<C234>,
62 /// DANGEROUS GOODS SHIPMENT FLASHPOINT
63 pub _040: Option<C223>,
64 /// PACKING GROUP, CODED
65 ///
66 /// C an..3
67 pub _050: Option<String>,
68 /// EMS NUMBER
69 ///
70 /// C an..6
71 pub _060: Option<String>,
72 /// MFAG
73 ///
74 /// C an..4
75 pub _070: Option<String>,
76 /// TREM CARD NUMBER
77 ///
78 /// C an..10
79 pub _080: Option<String>,
80 /// HAZARD IDENTIFICATION
81 pub _090: Option<C235>,
82 /// DANGEROUS GOODS LABEL
83 pub _100: Option<C236>,
84 /// PACKING INSTRUCTION, CODED
85 ///
86 /// C an..3
87 pub _110: Option<String>,
88 /// CATEGORY OF MEANS OF TRANSPORT, CODED
89 ///
90 /// C an..3
91 pub _120: Option<String>,
92 /// PERMISSION FOR TRANSPORT, CODED
93 ///
94 /// C an..3
95 pub _130: Option<String>,
96}
97
98/// DIM - DIMENSIONS
99///
100/// To specify dimensions.
101#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
102pub struct DIM {
103 /// DIMENSION QUALIFIER
104 ///
105 /// M an..3
106 pub _010: String,
107 /// DIMENSIONS
108 pub _020: C211,
109}
110
111/// DTM - DATE/TIME/PERIOD
112///
113/// To specify date, and/or time, or period.
114#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
115pub struct DTM {
116 /// DATE/TIME/PERIOD
117 pub _010: C507,
118}
119
120/// EQA - ATTACHED EQUIPMENT
121///
122/// To specify attached or related equipment.
123#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
124pub struct EQA {
125 /// EQUIPMENT QUALIFIER
126 ///
127 /// M an..3
128 pub _010: String,
129 /// EQUIPMENT IDENTIFICATION
130 pub _020: Option<C237>,
131}
132
133/// EQD - EQUIPMENT DETAILS
134///
135/// To identify a unit of equipment.
136#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
137pub struct EQD {
138 /// EQUIPMENT QUALIFIER
139 ///
140 /// M an..3
141 pub _010: String,
142 /// EQUIPMENT IDENTIFICATION
143 pub _020: Option<C237>,
144 /// EQUIPMENT SIZE AND TYPE
145 pub _030: Option<C224>,
146 /// EQUIPMENT SUPPLIER, CODED
147 ///
148 /// C an..3
149 pub _040: Option<String>,
150 /// EQUIPMENT STATUS, CODED
151 ///
152 /// C an..3
153 pub _050: Option<String>,
154 /// FULL/EMPTY INDICATOR, CODED
155 ///
156 /// C an..3
157 pub _060: Option<String>,
158}
159
160/// EQN - NUMBER OF UNITS
161///
162/// To specify the number of units.
163#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
164pub struct EQN {
165 /// NUMBER OF UNIT DETAILS
166 pub _010: C523,
167}
168
169/// FTX - Free Text
170///
171/// To provide free form or coded text information.
172#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
173pub struct FTX {
174 /// TEXT SUBJECT QUALIFIER
175 ///
176 /// M an..3
177 pub _010: String,
178 /// TEXT FUNCTION, CODED
179 ///
180 /// C an..3
181 pub _020: Option<String>,
182 pub _030: Option<C107>,
183 pub _040: Option<C108>,
184 /// LANGUAGE, CODED
185 ///
186 /// C an..3
187 pub _050: Option<String>,
188}
189
190/// MEA - MEASUREMENTS
191///
192/// To specify physical measurements, including dimension
193/// tolerances, weights and counts.
194#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
195pub struct MEA {
196 /// MEASUREMENT APPLICATION QUALIFIER M an..3
197 pub _010: String,
198 /// MEASUREMENT DETAILS C
199 pub _020: Option<C502>,
200 /// VALUE/RANGE C
201 pub _030: Option<C174>,
202 /// SURFACE/LAYER INDICATOR, CODED C an..3
203 pub _040: Option<String>,
204}
205
206/// LOC - PLACE/LOCATION IDENTIFICATION
207///
208/// To identify a country/place/location/related location
209/// one/related location two.
210#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
211pub struct LOC {
212 pub _010: String,
213 pub _020: Option<C517>,
214 pub _030: Option<C519>,
215 pub _040: Option<C553>,
216 /// RELATION, CODED
217 ///
218 /// C an..3
219 pub _050: Option<String>,
220}
221
222/// NAD - NAME AND ADDRESS
223///
224/// To specify the name/address and their related
225/// function, either by CO82 only and/or unstructured by
226/// CO58 or structured by CO80 thru 3207.
227#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
228pub struct NAD {
229 pub _010: String,
230 pub _020: Option<C082>,
231 pub _030: Option<C058>,
232 pub _040: Option<C080>,
233 pub _050: Option<C059>,
234 pub _060: Option<String>,
235 pub _070: Option<String>,
236 pub _080: Option<String>,
237 pub _090: Option<String>,
238}
239
240/// RFF - REFERENCE
241///
242/// To specify a reference.
243#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
244pub struct RFF {
245 // REFERENCE
246 pub _010: C506,
247}
248
249/// RNG - RANGE DETAILS
250///
251/// To identify a range.
252#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
253pub struct RNG {
254 /// RANGE TYPE QUALIFIER
255 ///
256 /// M an..3
257 pub _010: String,
258 /// RANGE
259 pub _020: Option<C280>,
260}
261/// SEL - SEAL NUMBER
262///
263/// To specify a seal number related to equipment.
264#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
265pub struct SEL {
266 /// SEAL NUMBER
267 ///
268 /// M an..10
269 pub _010: String,
270 /// SEAL ISSUER
271 pub _020: Option<C215>,
272 /// SEAL CONDITION, CODED
273 ///
274 /// C an..3
275 pub _030: Option<String>,
276}
277
278/// TDT - DETAILS OF TRANSPORT
279///
280/// To specify the transport details such as mode of
281/// transport, means of transport, its conveyance
282/// reference number and the identification of the means
283/// of transport.
284/// The segment may be pointed to by the TPL segment.
285#[derive(Default, Debug, Serialize, Deserialize, Clone, DisplayOuterSegment, ParseSegment)]
286pub struct TDT {
287 pub _010: String,
288 pub _020: Option<String>,
289 pub _030: Option<C220>,
290 pub _040: Option<C228>,
291 pub _050: Option<C040>,
292 pub _060: Option<String>,
293 pub _070: Option<C401>,
294 pub _080: Option<C222>,
295 pub _090: Option<String>,
296}
297
298/// TMD - TRANSPORT MOVEMENT DETAILS
299///
300/// To specify transport movement details for a goods item
301/// or equipment.
302#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
303pub struct TMD {
304 /// MOVEMENT TYPE
305 pub _010: Option<C219>,
306 /// EQUIPMENT PLAN
307 ///
308 /// C an..26
309 pub _020: Option<String>,
310 /// HAULAGE ARRANGEMENTS, CODED
311 ///
312 /// C an..3
313 pub _030: Option<String>,
314}
315
316/// TMP - TEMPERATURE
317///
318/// To specify the temperature setting.
319#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
320pub struct TMP {
321 /// TEMPERATURE QUALIFIER
322 ///
323 /// M an..3
324 pub _010: String,
325 /// TEMPERATURE SETTING
326 pub _020: Option<C239>,
327}
328
329/// UNA, Service String advice
330///
331/// Function: To define the characters selected for use
332/// as delimiters and indicators in the rest of the
333/// interchange that follows:
334///
335/// The specifications in the Service string advice take
336/// precedence over the specifications for delimiters etc. in
337/// segment UNB. See clause 4.
338///
339/// When transmitted, the Service string advice must appear
340/// immediately before the Interchange Header (UNB) segment and
341/// begin with the upper case characters UNA immediately followed
342/// by the six characters selected by the sender to indicate, in
343/// sequence, the following functions:
344/// Repr. | Req. | Name | Remarks
345/// --- | --- | --- | ---
346/// an1 | M | COMPONENT DATA ELEMENT SEPARATOR |
347/// an1 | M | DATA ELEMENT SEPARATOR |
348/// an1 | M | DECIMAL NOTATION | Comma or full stop
349/// an1 | M | RELEASE INDICATOR | If not used, insert space character
350/// an1 | M | Reserved for future use | Insert space character
351/// an1 | M | SEGMENT TERMINATOR |
352#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, DisplayOuterSegment)]
353pub struct UNA {
354 /// an1 M COMPONENT DATA ELEMENT SEPARATOR
355 pub component_data_element_seperator: char,
356 /// an1 M DATA ELEMENT SEPARATOR
357 pub data_element_seperator: char,
358 /// an1 M DECIMAL NOTATION Comma or full stop
359 pub decimal_notation: char,
360 /// an1 M RELEASE INDICATOR If not used, insert space character
361 pub release_indicator: char,
362 /// an1 M Reserved for future use Insert space character
363 pub reserved_for_future_use: char,
364 /// an1 M SEGMENT TERMINATOR
365 pub segment_terminator: char,
366}
367
368impl<'a> Parser<&'a str, UNA, nom::error::Error<&'a str>> for UNA {
369 fn parse(input: &'a str) -> IResult<&'a str, UNA> {
370 let (rest, vars) = take_until("UNB")(input)?;
371 if vars.is_empty() {
372 return Err(nom::Err::Error(nom::error::Error::new(
373 rest,
374 nom::error::ErrorKind::TakeUntil,
375 )));
376 }
377 // look for trailing newline
378 let vars = not_line_ending(vars)?.1;
379 if vars.len() != 9 {
380 println!("UNA Segment found, but malformed:\n{vars:?}");
381 panic!("UNA Segment malformed, needs to be exactly 6 characters")
382 }
383 let vars = vars.strip_prefix("UNA").unwrap();
384 let mut vars = vars.chars();
385 let una = UNA {
386 component_data_element_seperator: vars.next().unwrap(),
387 data_element_seperator: vars.next().unwrap(),
388 decimal_notation: vars.next().unwrap(),
389 release_indicator: vars.next().unwrap(),
390 reserved_for_future_use: vars.next().unwrap(),
391 segment_terminator: vars.next().unwrap(),
392 };
393 Ok((rest, una))
394 }
395}
396
397/// UNB Interchange header
398///
399/// To start, identify and specify an interchange.
400#[derive(
401 Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default, DisplayOuterSegment, ParseSegment,
402)]
403pub struct UNB {
404 _010: S001,
405 _020: S002,
406 _030: S003,
407 _040: S004,
408 /// Interchange control reference
409 ///
410 /// Unique reference assigned by the sender to an interchange.
411 /// Shall be identical in UNB and UNZ.
412 _050: String,
413 _060: Option<S005>,
414 _070: Option<String>,
415 _080: Option<_0029>,
416 _090: Option<_0031>,
417 _100: Option<String>,
418 _110: Option<_0035>,
419}
420
421/// UNH - MESSAGE HEADER
422///
423/// To head, identify and specify a message.
424#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
425pub struct UNH {
426 /// MESSAGE REFERENCE NUMBER
427 ///
428 /// M an..14
429 pub _010: String,
430 /// MESSAGE IDENTIFIER
431 pub _020: Option<S009>,
432 /// COMMON ACCESS REFERENCE
433 ///
434 /// C an..35
435 pub _030: Option<String>,
436 /// STATUS OF THE TRANSFER
437 pub _040: Option<S010>,
438}
439
440/// UNT - MESSAGE TRAILER
441///
442/// To end and check the completeness of a message.
443#[derive(Debug, Serialize, Deserialize, Default, Clone, DisplayOuterSegment, ParseSegment)]
444pub struct UNT {
445 /// NUMBER OF SEGMENTS IN THE MESSAGE
446 ///
447 /// M n..6
448 pub _010: String,
449 /// MESSAGE REFERENCE NUMBER
450 ///
451 /// M an..14
452 pub _020: String,
453}
454
455/// UNZ Interchange trailer
456///
457/// To end and check the completeness of an interchange.
458#[derive(
459 Serialize, Deserialize, Clone, Default, Debug, PartialEq, Eq, DisplayOuterSegment, ParseSegment,
460)]
461pub struct UNZ {
462 /// Interchange control count
463 ///
464 /// The count either of the number of messages or, if used, of the number of functional groups in an interchange. One of these counts shall appear.
465 _010: String,
466 /// Interchange control reference
467 ///
468 /// Unique reference assigned by the sender to an interchange.
469 /// Shall be identical in UNB and UNZ.
470 _020: String,
471}