From 604dbc0b81741ee611f59b14fac400700527b22e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonah=20Br=C3=BCchert?= Date: Thu, 11 Jun 2026 04:43:10 +0200 Subject: [PATCH] Make extended route types survive a parsing / serializing round trip --- src/enums.rs | 54 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/src/enums.rs b/src/enums.rs index ced96c1..33566aa 100644 --- a/src/enums.rs +++ b/src/enums.rs @@ -86,7 +86,7 @@ impl Serialize for LocationType { /// Describes the kind of [Route]. See `route_type` /// -/// -ome route types are extended GTFS ( +/// Some route types are extended GTFS ( #[derive(Debug, Default, Copy, Clone, PartialEq, Eq, Hash)] pub enum RouteType { /// Tram, Streetcar, Light rail. Any light rail or street level system within a metropolitan area @@ -116,6 +116,33 @@ pub enum RouteType { Other(i16), } +impl RouteType { + /// Simplify [`RouteType::Other`] into the named variants of the enum. + /// This may lose precision for extended route types. + pub fn simplify(&self) -> RouteType { + match self { + RouteType::Other(extended) => { + let hundreds = extended / 100; + match (*extended, hundreds) { + (0, _) | (_, 9) => RouteType::Tramway, + (1, _) | (_, 4) => RouteType::Subway, + (2, _) | (_, 1) => RouteType::Rail, + (3, _) | (_, 7) | (_, 8) => RouteType::Bus, + (4, _) | (_, 10) | (_, 12) => RouteType::Ferry, + (5, _) => RouteType::CableCar, + (6, _) | (_, 13) => RouteType::Gondola, + (7, _) | (_, 14) => RouteType::Funicular, + (_, 2) => RouteType::Coach, + (_, 11) => RouteType::Air, + (_, 15) => RouteType::Taxi, + _ => RouteType::Other(*extended), + } + } + route_type => *route_type, + } + } +} + impl<'de> Deserialize<'de> for RouteType { fn deserialize(deserializer: D) -> Result where @@ -123,19 +150,18 @@ impl<'de> Deserialize<'de> for RouteType { { let i = i16::deserialize(deserializer)?; - let hundreds = i / 100; - Ok(match (i, hundreds) { - (0, _) | (_, 9) => RouteType::Tramway, - (1, _) | (_, 4) => RouteType::Subway, - (2, _) | (_, 1) => RouteType::Rail, - (3, _) | (_, 7) | (_, 8) => RouteType::Bus, - (4, _) | (_, 10) | (_, 12) => RouteType::Ferry, - (5, _) => RouteType::CableCar, - (6, _) | (_, 13) => RouteType::Gondola, - (7, _) | (_, 14) => RouteType::Funicular, - (_, 2) => RouteType::Coach, - (_, 11) => RouteType::Air, - (_, 15) => RouteType::Taxi, + Ok(match i { + 0 => RouteType::Tramway, + 1 => RouteType::Subway, + 2 => RouteType::Rail, + 3 => RouteType::Bus, + 4 => RouteType::Ferry, + 5 => RouteType::CableCar, + 6 => RouteType::Gondola, + 7 => RouteType::Funicular, + 200 => RouteType::Coach, + 1100 => RouteType::Air, + 1500 => RouteType::Taxi, _ => RouteType::Other(i), }) }