THRIFT-4098 Namespace support for generated Rust code (#2348)
Client: rs
diff --git a/lib/rs/test_recursive/src/lib.rs b/lib/rs/test_recursive/src/lib.rs
new file mode 100644
index 0000000..bac37b4
--- /dev/null
+++ b/lib/rs/test_recursive/src/lib.rs
@@ -0,0 +1,276 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#![allow(dead_code)]
+
+pub mod transit;
+pub mod vehicles;
+pub mod maintenance;
+
+mod server {
+ use crate::maintenance::maintenance_facility::{
+ BigBarnSyncHandler, MultimodalFacilitySyncHandler,
+ };
+ use crate::transit::buses::{Bus, GarageSyncHandler};
+ use crate::transit::buses::{Powertrain, Route as BusRoute};
+ use crate::transit::light::streetcars::{
+ BarnSyncHandler, Flexity, RollingStock, Route, RouteNumber, Streetcar,
+ };
+ use crate::transit::services::city_services::TransitImprovements;
+ use crate::transit::trains::Locomotive;
+ use crate::transit::transporters::{FlatcarConsist, SingleVehicleTransporter};
+ use crate::vehicles::Material;
+ use thrift::Result;
+
+ //
+ // implement a whole bunch of handler methods just to make sure I can, and that everything compiles
+ //
+
+ pub struct AllInOneHandler;
+
+ impl BigBarnSyncHandler for AllInOneHandler {
+ fn handle_add_streetcar(&self, route: Route) -> Result<Streetcar> {
+ if let Some(route_number) = route.id {
+ match route_number {
+ RouteNumber::LAKESHORE => Ok(Streetcar {
+ id: Some(4417),
+ stock: Some(RollingStock::Flexity(Flexity {
+ materials: Some(vec![Material::STEEL, Material::ALUMINUM]),
+ locomotive: Some(Locomotive::ELECTRIC_PANTOGRAPH),
+ })),
+ route: Some(Route {
+ id: Some(RouteNumber::LAKESHORE),
+ improvements: None,
+ }),
+ }),
+ _ => Err(thrift::Error::from(format!(
+ "Cannot create streetcar for route number {}",
+ route_number.0
+ ))),
+ }
+ } else {
+ Err(thrift::Error::from("Can't add a streetcar"))
+ }
+ }
+ }
+
+ impl BarnSyncHandler for AllInOneHandler {
+ fn handle_upgrade_streetcar(&self, streetcar: Streetcar) -> Result<Streetcar> {
+ if let Some(rolling_stock) = streetcar.stock {
+ match rolling_stock {
+ RollingStock::Clrv(_) => Ok(Streetcar {
+ stock: Some(RollingStock::Flexity(Flexity {
+ materials: Some(vec![Material::STEEL, Material::ALUMINUM]),
+ locomotive: Some(Locomotive::ELECTRIC_PANTOGRAPH),
+ })),
+ ..streetcar
+ }),
+ RollingStock::Flexity(_) => {
+ Err(thrift::Error::from("Streetcar already upgraded"))
+ }
+ }
+ } else {
+ Err(thrift::Error::from("Can't upgrade streetcar"))
+ }
+ }
+ }
+
+ impl MultimodalFacilitySyncHandler for AllInOneHandler {
+ fn handle_build_transporter(
+ &self,
+ source: String,
+ destination: String,
+ consist: FlatcarConsist,
+ ) -> Result<SingleVehicleTransporter> {
+ Ok(SingleVehicleTransporter {
+ consist: Some(consist),
+ source: Some(source),
+ destination: Some(destination),
+ })
+ }
+ }
+
+ impl GarageSyncHandler for AllInOneHandler {
+ fn handle_upgrade_bus(&self, bus: Bus) -> Result<Bus> {
+ if let Some(p) = bus.powertrain {
+ match p {
+ Powertrain::COMPRESSED_NATURAL_GAS => Ok(Bus {
+ powertrain: Some(Powertrain::DIESEL),
+ ..bus
+ }),
+ _ => Err(thrift::Error::from("Cannot upgrade from this powertrain")),
+ }
+ } else {
+ Err(thrift::Error::from("Cannot upgrade bus"))
+ }
+ }
+
+ fn handle_improvements_for_route(
+ &self,
+ route: BusRoute,
+ ) -> Result<Vec<TransitImprovements>> {
+ Ok(route
+ .improvements
+ .expect("Expecting a list of improvements"))
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+
+ //
+ // TODO: consider using the generated client/server and doing a round-trip
+ //
+
+ use crate::server::AllInOneHandler;
+ use crate::transit::buses::{Bus, Powertrain, Route as BusRoute, DEFAULT4WHEELCAPACITY};
+ use crate::transit::light::light_rail::Lrt;
+ use crate::transit::light::streetcars::{
+ BarnSyncHandler, Flexity, RollingStock, Route, RouteNumber, Streetcar, CLRV,
+ };
+ use crate::transit::services::city_services::TransitImprovements;
+ use crate::transit::trains::Locomotive;
+ use crate::transit::transporters::{FlatcarConsist, SingleVehicleTransporter};
+ use crate::vehicles::{Material, VehicleIdentifier};
+
+ use crate::maintenance::maintenance_facility::{
+ BigBarnSyncHandler, MultimodalFacilitySyncHandler,
+ };
+ use crate::transit::buses::GarageSyncHandler;
+
+ #[test]
+ fn handle_add_streetcar_compiles_and_returns_expected_value() {
+ let expected = Streetcar {
+ id: Some(4417),
+ stock: Some(RollingStock::Flexity(Flexity {
+ materials: Some(vec![Material::STEEL, Material::ALUMINUM]),
+ locomotive: Some(Locomotive::ELECTRIC_PANTOGRAPH),
+ })),
+ route: Some(Route {
+ id: Some(RouteNumber::LAKESHORE),
+ improvements: None,
+ }),
+ };
+
+ let handler = AllInOneHandler {};
+ let actual = handler
+ .handle_add_streetcar(Route {
+ id: Some(RouteNumber::LAKESHORE),
+ improvements: None,
+ })
+ .expect("Expected a result");
+
+ assert_eq!(expected, actual)
+ }
+
+ #[test]
+ fn handle_upgrade_streetcar_compiles_and_returns_expected_value() {
+ let input = Streetcar {
+ stock: Some(RollingStock::Clrv(CLRV {
+ materials: Some(vec![Material::STEEL, Material::ALUMINUM]),
+ locomotive: Some(Locomotive::ELECTRIC_POLE),
+ })),
+ id: Some(4415),
+ route: Some(Route {
+ id: Some(RouteNumber::SPADINA),
+ improvements: Some(vec![TransitImprovements::DEDICATED_RIGHT_OF_WAY]),
+ }),
+ };
+
+ let expected = Streetcar {
+ stock: Some(RollingStock::Flexity(Flexity {
+ materials: Some(vec![Material::STEEL, Material::ALUMINUM]),
+ locomotive: Some(Locomotive::ELECTRIC_PANTOGRAPH),
+ })),
+ id: Some(4415),
+ route: Some(Route {
+ id: Some(RouteNumber::SPADINA),
+ improvements: Some(vec![TransitImprovements::DEDICATED_RIGHT_OF_WAY]),
+ }),
+ };
+
+ let handler = AllInOneHandler {};
+ let actual = handler
+ .handle_upgrade_streetcar(input)
+ .expect("Expected an upgraded streetcar");
+
+ assert_eq!(expected, actual)
+ }
+
+ #[test]
+ fn handle_build_transporter_compiles_and_returns_expected_value() {
+ let consist = FlatcarConsist::Lrt(Lrt {
+ materials: Some(vec![Material::STEEL, Material::ALUMINUM]),
+ locomotive: Some(Locomotive::ELECTRIC_PANTOGRAPH),
+ });
+ let expected = SingleVehicleTransporter {
+ consist: Some(consist.clone()),
+ source: Some("905".to_owned()),
+ destination: Some("416".to_owned()),
+ };
+
+ let handler = AllInOneHandler {};
+ let actual = handler
+ .handle_build_transporter("905".to_owned(), "416".to_owned(), consist)
+ .expect("Expected a transporter");
+
+ assert_eq!(expected, actual)
+ }
+
+ #[test]
+ fn handle_upgrade_bus_compiles_and_returns_expected_value() {
+ let bus = Bus {
+ identifier: Some(VehicleIdentifier {
+ manufacturer: Some("Orion".to_owned()),
+ model: Some("Orion 07.501 NG HEV".to_owned()),
+ qualifiers: None,
+ }),
+ capacity: Some(DEFAULT4WHEELCAPACITY),
+ powertrain: Some(Powertrain::COMPRESSED_NATURAL_GAS),
+ materials: Some(vec![Material::STEEL, Material::ALUMINUM]),
+ };
+
+ let expected = Bus {
+ powertrain: Some(Powertrain::DIESEL),
+ ..(bus.clone())
+ };
+
+ let handler = AllInOneHandler {};
+ let actual = handler
+ .handle_upgrade_bus(bus)
+ .expect("Expected improved bus");
+
+ assert_eq!(expected, actual)
+ }
+
+ #[test]
+ fn handle_improvements_for_route_compiles_and_returns_expected_value() {
+ let expected = vec![TransitImprovements::TRANSIT_SIGNAL_PRIORITY];
+ let bus_route = BusRoute {
+ route_id: Some("320".to_owned()),
+ improvements: Some(expected.clone()),
+ };
+
+ let handler = AllInOneHandler {};
+ let actual = handler
+ .handle_improvements_for_route(bus_route)
+ .expect("Expected list of transit improvements");
+
+ assert_eq!(expected, actual)
+ }
+}