hafas_rs/parse/
common.rs

1use crate::parse::line::HafasLine;
2use crate::parse::load_factor::HafasLoadFactorEntry;
3use crate::parse::load_factor::LoadFactorEntry;
4use crate::parse::location::HafasPlace;
5use crate::parse::operator::HafasOperator;
6#[cfg(feature = "polylines")]
7use crate::parse::polyline::HafasPolyline;
8use crate::parse::remark::HafasRemark;
9use crate::Line;
10use crate::ParseResult;
11use crate::Place;
12use crate::Profile;
13use crate::Remark;
14use crate::TariffClass;
15use serde::Deserialize;
16
17#[derive(Debug, Deserialize)]
18#[serde(rename_all = "camelCase")]
19pub struct HafasCommon {
20    loc_l: Vec<HafasPlace>,
21    prod_l: Vec<HafasLine>,
22    op_l: Option<Vec<HafasOperator>>,
23    tcoc_l: Option<Vec<HafasLoadFactorEntry>>,
24    rem_l: Option<Vec<HafasRemark>>,
25    #[cfg(feature = "polylines")]
26    poly_l: Option<Vec<HafasPolyline>>,
27}
28
29#[derive(Debug)]
30pub struct CommonData {
31    pub tariff_class: TariffClass,
32    pub places: Vec<Option<Place>>,
33    pub lines: Vec<Option<Line>>,
34    pub load_factors: Vec<LoadFactorEntry>,
35    pub remarks: Vec<Option<Remark>>,
36    #[cfg(feature = "polylines")]
37    pub polylines: Vec<Vec<geojson::Feature>>,
38}
39
40pub(crate) fn default_parse_common<P: Profile + ?Sized>(
41    profile: &P,
42    data: HafasCommon,
43    tariff_class: TariffClass,
44) -> ParseResult<CommonData> {
45    let HafasCommon {
46        loc_l,
47        prod_l,
48        op_l,
49        tcoc_l,
50        rem_l,
51        #[cfg(feature = "polylines")]
52        poly_l,
53    } = data;
54    let operators: Vec<_> = op_l
55        .map(|x| {
56            x.into_iter()
57                .map(|x| profile.parse_operator(x))
58                .collect::<ParseResult<_>>()
59        })
60        .transpose()?
61        .unwrap_or_default();
62    Ok(CommonData {
63        tariff_class,
64        places: loc_l
65            .into_iter()
66            .map(|x| profile.parse_place(x).ok())
67            .collect(),
68        lines: prod_l
69            .into_iter()
70            .map(|x| profile.parse_line(x, &operators).ok())
71            .collect(),
72        load_factors: tcoc_l
73            .unwrap_or_default()
74            .into_iter()
75            .map(|x| profile.parse_load_factor_entry(x))
76            .collect::<ParseResult<_>>()?,
77        remarks: rem_l
78            .unwrap_or_default()
79            .into_iter()
80            .map(|x| profile.parse_remark(x).ok())
81            .collect(),
82        #[cfg(feature = "polylines")]
83        polylines: poly_l
84            .map(|x| {
85                x.into_iter()
86                    .map(|x| profile.parse_polyline(x))
87                    .collect::<ParseResult<_>>()
88            })
89            .transpose()?
90            .unwrap_or_default(),
91    })
92}