use std::collections::BTreeSet;
use std::fmt::{self, Display, Formatter};
use tracing::warn;
#[derive(Debug, Eq, PartialEq, PartialOrd, Ord, Clone, Copy)]
pub enum NetexMode {
Air = 1,
Water = 2,
Rail = 3,
Metro = 4,
Tram = 5,
Funicular = 6,
Cableway = 7,
Coach = 8,
Bus = 9,
}
impl Display for NetexMode {
fn fmt(&self, f: &mut Formatter) -> std::result::Result<(), fmt::Error> {
use NetexMode::*;
match self {
Air => write!(f, "air"),
Bus => write!(f, "bus"),
Cableway => write!(f, "cableway"),
Coach => write!(f, "coach"),
Funicular => write!(f, "funicular"),
Metro => write!(f, "metro"),
Rail => write!(f, "rail"),
Tram => write!(f, "tram"),
Water => write!(f, "water"),
}
}
}
impl NetexMode {
pub fn from_physical_mode_id(physical_mode_id: &str) -> Option<NetexMode> {
use NetexMode::*;
match physical_mode_id {
"Air" => Some(Air),
"Boat" => Some(Water),
"Bus" => Some(Bus),
"BusRapidTransit" => Some(Bus),
"Coach" => Some(Coach),
"Ferry" => Some(Water),
"Funicular" => Some(Funicular),
"LocalTrain" => Some(Rail),
"LongDistanceTrain" => Some(Rail),
"Metro" => Some(Metro),
"RapidTransit" => Some(Rail),
"RailShuttle" => Some(Rail),
"Shuttle" => Some(Bus),
"SuspendedCableCar" => Some(Cableway),
"Train" => Some(Rail),
"Tramway" => Some(Tram),
mode => {
warn!(
"Physical Mode '{}' is not supported for NeTEx France export.",
mode
);
None
}
}
}
pub fn calculate_highest_mode(netex_modes: &BTreeSet<NetexMode>) -> Option<NetexMode> {
netex_modes.iter().next().cloned()
}
}