use crate::directions::error::Error;
use serde::{Serialize, Deserialize};
#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, Deserialize)]
pub enum VehicleType {
#[serde(alias = "BUS")]
Bus,
#[serde(alias = "CABLE_CAR")]
CableCar,
#[serde(alias = "COMMUTER_TRAIN")]
CommuterTrain,
#[serde(alias = "FERRY")]
Ferry,
#[serde(alias = "FUNICULAR")]
Funicular,
#[serde(alias = "GONDOLA_LIFT")]
GondolaLift,
#[serde(alias = "HEAVY_RAIL")]
HeavyRail,
#[serde(alias = "HIGH_SPEED_TRAIN")]
HighSpeedTrain,
#[serde(alias = "INTERCITY_BUS")]
IntercityBus,
#[serde(alias = "LONG_DISTANCE_TRAIN")]
LongDistanceTrain,
#[serde(alias = "METRO_RAIL")]
MetroRail,
#[serde(alias = "MONORAIL")]
Monorail,
#[serde(alias = "OTHER")]
Other,
#[serde(alias = "RAIL")]
Rail,
#[serde(alias = "SHARE_TAXI")]
ShareTaxi,
#[serde(alias = "SUBWAY")]
Subway,
#[serde(alias = "TRAM")]
Tram,
#[serde(alias = "TROLLEYBUS")]
Trolleybus,
}
impl std::convert::From<&VehicleType> for String {
fn from(vehicle_type: &VehicleType) -> String {
match vehicle_type {
VehicleType::Bus => String::from("BUS"),
VehicleType::CableCar => String::from("CABLE_CAR"),
VehicleType::CommuterTrain => String::from("COMMUTER_TRAIN"),
VehicleType::Ferry => String::from("FERRY"),
VehicleType::Funicular => String::from("FUNICULAR"),
VehicleType::GondolaLift => String::from("GONDOLA_LIFT"),
VehicleType::HeavyRail => String::from("HEAVY_RAIL"),
VehicleType::HighSpeedTrain => String::from("HIGH_SPEED_TRAIN"),
VehicleType::IntercityBus => String::from("INTERCITY_BUS"),
VehicleType::LongDistanceTrain => String::from("LONG_DISTANCE_TRAIN"),
VehicleType::MetroRail => String::from("METRO_RAIL"),
VehicleType::Monorail => String::from("MONORAIL"),
VehicleType::Other => String::from("OTHER"),
VehicleType::Rail => String::from("RAIL"),
VehicleType::ShareTaxi => String::from("SHARE_TAXI"),
VehicleType::Subway => String::from("SUBWAY"),
VehicleType::Tram => String::from("TRAM"),
VehicleType::Trolleybus => String::from("TROLLEYBUS"),
}
}
}
impl std::convert::TryFrom<&str> for VehicleType {
type Error = crate::directions::error::Error;
fn try_from(vehicle_type: &str) -> Result<VehicleType, Error> {
match vehicle_type {
"BUS" => Ok(VehicleType::Bus),
"CABLE_CAR" => Ok(VehicleType::CableCar),
"COMMUTER_TRAIN" => Ok(VehicleType::CommuterTrain),
"FERRY" => Ok(VehicleType::Ferry),
"FUNICULAR" => Ok(VehicleType::Funicular),
"GONDOLA_LIFT" => Ok(VehicleType::GondolaLift),
"HEAVY_RAIL" => Ok(VehicleType::HeavyRail),
"HIGH_SPEED_TRAIN" => Ok(VehicleType::HighSpeedTrain),
"INTERCITY_BUS" => Ok(VehicleType::IntercityBus),
"LONG_DISTANCE_TRAIN" => Ok(VehicleType::LongDistanceTrain),
"METRO_RAIL" => Ok(VehicleType::MetroRail),
"MONORAIL" => Ok(VehicleType::Monorail),
"OTHER" => Ok(VehicleType::Other),
"RAIL" => Ok(VehicleType::Rail),
"SHARE_TAXI" => Ok(VehicleType::ShareTaxi),
"SUBWAY" => Ok(VehicleType::Subway),
"TRAM" => Ok(VehicleType::Tram),
"TROLLEYBUS" => Ok(VehicleType::Trolleybus),
_ => Err(Error::InvalidVehicleTypeCode(vehicle_type.to_string())),
}
}
}
impl std::default::Default for VehicleType {
fn default() -> Self {
VehicleType::Bus
}
}
impl std::fmt::Display for VehicleType {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
VehicleType::Bus => write!(f, "Bus"),
VehicleType::CableCar => write!(f, "Cable Car"),
VehicleType::CommuterTrain => write!(f, "Commuter Train"),
VehicleType::Ferry => write!(f, "Ferry"),
VehicleType::Funicular => write!(f, "Funicular"),
VehicleType::GondolaLift => write!(f, "Gondola Lift"),
VehicleType::HeavyRail => write!(f, "Heavy Rail"),
VehicleType::HighSpeedTrain => write!(f, "High Speed Train"),
VehicleType::IntercityBus => write!(f, "Intercity Bus"),
VehicleType::LongDistanceTrain => write!(f, "Long Distance Train"),
VehicleType::MetroRail => write!(f, "Metro Rail"),
VehicleType::Monorail => write!(f, "Monorail"),
VehicleType::Other => write!(f, "Other"),
VehicleType::Rail => write!(f, "Rail"),
VehicleType::ShareTaxi => write!(f, "Share Taxi"),
VehicleType::Subway => write!(f, "Subway"),
VehicleType::Tram => write!(f, "Tram"),
VehicleType::Trolleybus => write!(f, "Trolleybus"),
}
}
}