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}