eterm-parser 0.1.1

eterm parser for Rust
Documentation
#[test]
fn parse_av_test() {
    let text = r" 03AUG(THU) PKXSHA VIA KN  
1- *KN6856  DS# JA C8 YA BA HA KA LA RQ SQ TQ  PKXXIY 0900   1120   321 0^B  E  
>   MU2104      GQ UQ ZQ                                            -- T3 02:20
    MU2159  DS# J7 C5 D4 Q2 IQ YA BA MA EA HQ     SHA 1400   1620   32L 0^S  E  
>               KA LA NQ RQ SQ VQ TQ GQ ZQ                          T3 T2 07:20
2  *KN6856  DS# JA C8 YA BA HA KA LA RQ SQ TQ  PKXXIY 0900   1120   321 0^B  E  
>   MU2104      GQ UQ ZQ                                            -- T3 02:20
   *MU3502  DS# YA BS MA ES KA LS NA RA SQ VQ     PVG 1500   1720   32S 0^S  E  
>   HO1212                                                          T3 T2 08:20
3   KN5730  DS# WA YA BA MA EA HA KA LA NA R6  PKXWNZ 0915   1145   73U 0^   E  
>               SQ VQ DQ TQ IQ ZQ U5 PQ GQ QS AQ                    -- T2 02:30
    FM9530  DS# J7 C7 D7 Q6 I4 YA BA MA EA HA     PVG 1545   1650   73E 0^   E  
>               KA LA NA RA SA VA TA GS ZA                          T2 T1 07:35
4+  KN5730  DS# WA YA BA MA EA HA KA LA NA R6  PKXWNZ 0915   1145   73U 0^   E  
>               SQ VQ DQ TQ IQ ZQ U5 PQ GQ QS AQ                    -- T2 02:30
   *MU8610  DS# J7 C7 D7 Q6 I4 YA BA MA EA HA     PVG 1545   1650   73E 0^   E  
>   FM9530      KA LA NA RA SA VA TA GS ZA                          T2 T1 07:35";

    if let Ok(av) = eterm_parser::parse_av(text) {
        assert_eq!(av.dpt, Some("PKX"));
        assert_eq!(av.arr, Some("SHA"));
        assert_eq!(av.date, Some("03AUG"));
        for flight in av.flights {
            match flight.index {
                1 => {
                    assert_eq!(flight.flight_no, "KN6856");
                    assert_eq!(flight.real_flight_no, Some("MU2104"));
                    for union_flight in flight.union_flights {
                        match union_flight.index {
                            0 => {
                                assert_eq!(union_flight.flight_no, "MU2159");
                            }
                            _ => {}
                        }
                    }
                }
                2 => {
                    assert_eq!(flight.flight_no, "KN6856");
                    assert_eq!(flight.real_flight_no, Some("MU2104"));
                }
                _ => {}
            }
        }
    } else {
        panic!("av parse error");
    }
}

#[test]
fn parse_detr_test() {
    let text = r"ET PROCESSING IN PROGRESS   
AATK:TN/9992303753785   
ISSUED BY: AIR CHINA                 ORG/DST: HET/SIA                 ARL-D 
TOUR CODE: ZCC4000LC
PASSENGER: dwfei
EXCH:                               CONJ TKT:   
O FM:1HET CA    8113  S 21MAY 0815 OK S                        20K OPEN FOR USE 
     --T2 RL:NZJ0JY  /  
  TO: XIY   b
FC: M  21MAY23HET CA XIY308.00CNY308.00END  
FARE:           CNY  308.00|FOP:CC VI184
TAX:               EXEMPTCN|OI: 
TAX:            CNY 60.00YQ|                                                   +
";

    if let Ok(detr) = eterm_parser::parse_detr(text) {
        assert_eq!(detr.org, Some("HET"));
        assert_eq!(detr.dst, Some("SIA"));
        assert_eq!(
            detr.fare,
            Some(eterm_parser::detr::DetrFareItem {
                item_type: None,
                amount: Some(308f32),
                currency: Some("CNY"),
                is_exempt: false
            })
        );
    } else {
        panic!("detr parse error");
    }
}

#[test]
fn parse_fd_test() {
    let text = r"FD:KMGCTU/05SEP23/KY                   /CNY /TPM   744/                         
01 KY/J     / 5100.00=10200.00/J /C/  /   .   /25DEC19        /J000  PFN:01    
02 KY/G     / 1700.00= 3400.00/G /Y/  /   .   /25DEC19        /J000  PFN:02    
03 KY/Y     / 1700.00= 3400.00/Y /Y/  /   .   /25DEC19        /J000  PFN:03    
04 KY/B     / 1680.00= 3360.00/B /Y/  /   .   /25DEC19        /J000  PFN:04    
05 KY/M     / 1580.00= 3160.00/M /Y/  /   .   /25DEC19        /J000  PFN:05    
06 KY/M1    / 1500.00= 3000.00/M /Y/  /   .   /25DEC19        /J000  PFN:06    
07 KY/U     / 1410.00= 2820.00/U /Y/  /   .   /25DEC19        /J000  PFN:07    
08 KY/H     / 1330.00= 2660.00/H /Y/  /   .   /25DEC19        /J000  PFN:08    
09 KY/Q     / 1240.00= 2480.00/Q /Y/  /   .   /25DEC19        /J000  PFN:09    
10 KY/Q1    / 1160.00= 2320.00/Q /Y/  /   .   /25DEC19        /J000  PFN:10    
11 KY/V     / 1070.00= 2140.00/V /Y/  /   .   /25DEC19        /J000  PFN:11    
12 KY/V1    /  990.00= 1980.00/V /Y/  /   .   /25DEC19        /J000  PFN:12    
13 KY/W     /  900.00= 1800.00/W /Y/  /   .   /25DEC19        /J000  PFN:13    
14 KY/S     /  820.00= 1640.00/S /Y/  /   .   /25DEC19        /J000  PFN:14    
15 KY/E     /  730.00= 1460.00/E /Y/  /   .   /25DEC19        /J000  PFN:15    
                                                                                
PAGE 1/1       /LPRIC/C52DZF3YARTGI11                                           ";
    if let Ok(fd) = eterm_parser::parse_fd(text) {
        assert_eq!(fd.org, Some("KMG"));
        if let Some(items) = fd.items {
            for item in items {
                match item.index {
                    Some(1) => {
                        assert_eq!(item.ticket_type, Some("J"));
                    }
                    Some(2) => {
                        assert_eq!(item.ow_price, Some(1700.0f32));
                    }
                    Some(3) => {
                        assert_eq!(item.rt_price, Some(3400.0f32));
                    }
                    _ => {}
                }
            }
        }
    } else {
        panic!("fd parse error");
    }
}

#[test]
fn parse_ml_test() {
    let text = r"MULTI                                                                           
8L9681 /08SEP          C                                                        
KHGNGQ                                                                          
NIL                                                                             
URCKHG                                                                          
 001   0DILIAYIAILI      HP3M9L T HX1  VVV211 07SEP      K    T                 
 002   1MEIHEREYIABULAI+ KYAH8R T RR1  VVV211 07SEP      K O ST                 
URCNGQ                                                                          
NIL                                                                             
TOTAL NUMBER    1";
    if let Ok(ml) = eterm_parser::parse_ml(text) {
        assert_eq!(ml.flight_no, Some("8L9681"));
    } else {
        panic!("ml parse error");
    }
}

#[test]
fn parse_pat_test() {
    let text = r">PAT:A                                                                          
01 T FARE:CNY520.00 TAX:CNY50.00 YQ:CNY110.00  TOTAL:680.00                     
SFC:01   SFN:01                                                               
PAGE 1/1       /LPRIC/L3OF13GAATTP15";
    if let Ok(pat) = eterm_parser::parse_pat(text) {
        if let Some(items) = pat.items {
            for item in items {
                assert_eq!(
                    item.fare,
                    Some(eterm_parser::pat::PatPrice {
                        currency: Some("CNY"),
                        price: Some(520.0f32),
                        is_exemption: false
                    })
                );
            }
        }
    } else {
        panic!("pat parse error");
    }
}

#[test]
fn parse_pnr_test() {
    let text = r"  **ELECTRONIC TICKET PNR**                                                     
 1.石风芸CHD KE9SWE                                                             
 2.  JD5324 Y   WE06SEP  DXJPKX RR1   1045 1310          E                      
 3.KMG/T KMG/T 037968926796/KUNMING WKN TANG TRADING CO. LTD./ZHANGSAN      
 4.T                                                                            
 5.SSR FOID JD HK1 NI433101202105250023/P1                                      
 6.SSR ADTK 1E BY KMG28AUG23/1742 OR CXL JD5324 Y06SEP                          
 7.SSR TKNE JD HK1 DXJPKX 5324 Y06SEP 8989198306578/1/P1                        
 8.SSR CHLD JD HK1 25MAY21/P1                                                   
 9.OSI JD CTCT13320512490                                                       
10.OSI JD CTCM15718791505/P1                                                    
11.OSI JD ADT/8989198306575    ";
    if let Ok(pnr) = eterm_parser::parse_pnr(text) {
        assert_eq!(pnr.pnr_code, Some("KE9SWE"));
        if let Some(nms) = pnr.nm_items {
            for nm in nms {
                match nm.index {
                    1 => {
                        assert_eq!(nm.name, Some("石风芸CHD"));
                    }
                    _ => {}
                }
            }
        }
        if let Some(segs) = pnr.seg_items {
            for seg in segs {
                match seg.index {
                    2 => {
                        assert_eq!(seg.flight_no, Some("JD5324"));
                    }
                    _ => {}
                }
            }
        }
    } else {
        panic!("pnr parse error");
    }
}