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}