use chrono::{NaiveDate, NaiveDateTime};
use derive_more::{Display, From};
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::{collections::BTreeMap, str::FromStr};
use to_and_fro::{output_case, ToAndFro};
use crate::helpers::{
de_iso_8601, de_rfc3339, de_service_time, deserialize_path, opt_de_rfc3339, opt_ser_rfc3339,
ser_disruption_query, ser_iso_8601, ser_rfc3339, ser_touch_utc,
};
pub struct I32ButSilly(pub i32);
impl<'de> Deserialize<'de> for I32ButSilly {
fn deserialize<D>(deserializer: D) -> Result<I32ButSilly, D::Error>
where
D: serde::Deserializer<'de>,
{
let value = String::deserialize(deserializer)?;
Ok(I32ButSilly(
i32::from_str(&value).map_err(|e| serde::de::Error::custom(format!("{e:?}")))?,
))
}
}
macro_rules! newtype_i32 {
($name:ident) => {
#[derive(Debug, Copy, Clone, Deserialize, Serialize, Display, PartialEq, Eq, PartialOrd, Ord)]
#[serde(transparent)]
pub struct $name(pub i32);
};
($name:ident, $($extra:tt)*) => {
#[derive(Debug, Copy, Clone, Deserialize, Serialize, Display, PartialEq, Eq, PartialOrd, Ord, $($extra)*)]
#[serde(transparent)]
pub struct $name(pub i32);
};
}
newtype_i32!(DisruptionId);
newtype_i32!(RunId);
newtype_i32!(StopId);
newtype_i32!(RouteId);
newtype_i32!(DirectionId);
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Geopath {
pub direction_id: DirectionId,
pub valid_from: NaiveDate,
pub valid_to: NaiveDate,
#[serde(deserialize_with = "deserialize_path")]
pub paths: Vec<Vec<(Decimal, Decimal)>>,
}
#[derive(Debug, Copy, Clone, Display, From, PartialEq, Eq, PartialOrd, Ord)]
#[repr(i8)]
pub enum RouteType {
Train = 0,
Tram = 1,
Bus = 2,
VLine = 3,
NightBus = 4,
Other(i8),
}
impl Serialize for RouteType {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
i8::from(*self).serialize(serializer)
}
}
impl<'de> Deserialize<'de> for RouteType {
fn deserialize<D>(deserializer: D) -> Result<RouteType, D::Error>
where
D: serde::Deserializer<'de>,
{
Ok(match i8::deserialize(deserializer)? {
0 => RouteType::Train,
1 => RouteType::Tram,
2 => RouteType::Bus,
3 => RouteType::VLine,
4 => RouteType::NightBus,
x => RouteType::Other(x),
})
}
}
impl From<RouteType> for i8 {
fn from(value: RouteType) -> Self {
match value {
RouteType::Train => 0,
RouteType::Tram => 1,
RouteType::Bus => 2,
RouteType::VLine => 3,
RouteType::NightBus => 4,
RouteType::Other(x) => x,
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone, From, Copy)]
#[serde(tag = "disruption_mode_name", content = "disruption_mode")]
#[repr(i8)]
pub enum DisruptionModes {
#[serde(rename = "metro_train")]
MetroTrain = 1, #[serde(rename = "metro_bus")]
MetroBus = 2,
#[serde(rename = "metro_tram")]
MetroTram = 3,
#[serde(rename = "regional_coach")]
RegionalCoach = 4,
#[serde(rename = "regional_train")]
RegionalTrain = 5,
#[serde(rename = "regional_bus")]
RegionalBus = 7,
#[serde(rename = "school_bus")]
SchoolBus = 8,
#[serde(rename = "telebus")]
Telebus = 9,
#[serde(rename = "night_bus")]
NightBus = 10,
#[serde(rename = "ferry")]
Ferry = 11,
#[serde(rename = "interstate_train")]
InterstateTrain = 12,
#[serde(rename = "skybus")]
Skybus = 13,
#[serde(rename = "taxi")]
Taxi = 14,
#[serde(rename = "general")]
General = 100,
}
impl DisruptionModes {
pub fn as_number(&self) -> i8 {
*self as i8
}
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Status {
pub version: String,
pub health: i8,
}
#[derive(Serialize, Default)]
pub struct DeparturesStopOpts {
#[serde(skip_serializing_if = "Option::is_none")]
pub platform_numbers: Option<Vec<i32>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub direction_id: Option<DirectionId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gtfs: Option<bool>,
#[serde(serialize_with = "ser_iso_8601")]
#[serde(rename = "date_utc")]
#[serde(skip_serializing_if = "Option::is_none")]
pub date: Option<NaiveDateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_results: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_cancelled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub look_backwards: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expand: Option<Vec<ExpandOptions>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_geopath: Option<bool>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct ApiError {
pub message: String,
pub status: Status,
}
#[derive(Serialize, Default)]
pub struct DeparturesStopRouteOpts {
#[serde(skip_serializing_if = "Option::is_none")]
pub direction_id: Option<DirectionId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gtfs: Option<bool>,
#[serde(serialize_with = "ser_iso_8601")]
#[serde(rename = "date_utc")]
#[serde(skip_serializing_if = "Option::is_none")]
pub date: Option<NaiveDateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_results: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_cancelled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub look_backwards: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expand: Option<Vec<ExpandOptions>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_geopath: Option<bool>,
}
#[derive(ToAndFro, Serialize)]
pub enum ExpandOptions {
All,
Stop,
Route,
Run,
Direction,
Disruption,
VehiclePosition,
VehicleDescriptor,
None,
}
impl<'de> Deserialize<'de> for ExpandOptions {
fn deserialize<D>(deserializer: D) -> Result<ExpandOptions, D::Error>
where
D: serde::Deserializer<'de>,
{
let value = String::deserialize(deserializer)?;
Self::from_str(&value).map_err(serde::de::Error::custom)
}
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct DeparturesResponse {
pub departures: Vec<Departure>,
pub stops: BTreeMap<String, Stop>,
pub routes: BTreeMap<String, RouteWithGeoPath>,
pub runs: BTreeMap<String, Run>,
pub directions: BTreeMap<String, Direction>,
pub disruptions: BTreeMap<String, Disruption>,
pub status: Status,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct StoppingPatternsStop {
#[serde(flatten)]
pub stop: Stop,
pub stop_ticket: StopTicket,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Stop {
#[serde(rename = "stop_distance")]
pub distance: Decimal,
#[serde(rename = "stop_suburb")]
pub suburb: String,
#[serde(rename = "stop_name")]
pub name: String,
#[serde(rename = "stop_id")]
pub id: StopId,
pub route_type: RouteType,
#[serde(rename = "stop_latitude")]
pub latitude: Decimal,
#[serde(rename = "stop_longitude")]
pub longitude: Decimal,
#[serde(rename = "stop_landmark")]
pub landmark: String,
#[serde(rename = "stop_sequence")]
pub sequence: i32,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Departure {
pub stop_id: StopId,
pub route_id: RouteId,
pub run_id: RunId,
pub run_ref: String,
pub direction_id: DirectionId,
pub disruption_ids: Vec<DisruptionId>,
#[serde(deserialize_with = "opt_de_rfc3339")]
#[serde(serialize_with = "opt_ser_rfc3339")]
#[serde(rename = "scheduled_departure_utc")]
pub scheduled_departure: Option<NaiveDateTime>, #[serde(deserialize_with = "opt_de_rfc3339")]
#[serde(serialize_with = "opt_ser_rfc3339")]
#[serde(rename = "estimated_departure_utc")]
pub estimated_departure: Option<NaiveDateTime>,
pub at_platform: bool,
pub platform_number: Option<String>,
pub flags: String,
pub departure_sequence: i32,
pub skipped_stops: Option<Vec<Stop>>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct StopTicket {
pub ticket_type: String,
pub zone: String,
pub is_free_fare_zone: bool,
pub ticket_machine: bool,
pub ticket_checks: bool,
pub vline_reservation: bool,
pub ticket_zones: Vec<i32>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Route {
pub route_type: RouteType,
#[serde(rename = "route_id")]
pub id: RouteId,
#[serde(rename = "route_name")]
pub name: String,
#[serde(rename = "route_number")]
pub number: String,
#[serde(rename = "route_gtfs_id")]
pub gtfs_id: String,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct RouteWithGeoPath {
#[serde(flatten)]
pub route: Route,
pub geopath: Option<Vec<Geopath>>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Direction {
#[serde(rename = "direction_id")]
pub id: DirectionId,
#[serde(rename = "direction_name")]
pub name: String,
pub route_id: RouteId,
pub route_type: RouteType,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct DirectionsResponse {
pub directions: Vec<DirectionWithDescription>,
pub status: Status,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct DirectionWithDescription {
#[serde(flatten)]
pub direction: Direction,
#[serde(rename = "route_direction_description")]
pub description: String,
}
#[derive(Serialize, Default)]
pub struct DisruptionsOpts {
#[serde(skip_serializing_if = "Option::is_none")]
pub route_types: Option<Vec<RouteType>>,
#[serde(rename = "disruption_modes")]
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(serialize_with = "ser_disruption_query")]
pub modes: Option<Vec<DisruptionModes>>,
#[serde(rename = "disruption_status")]
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<DisruptionStatus>,
}
#[derive(Serialize, Default)]
pub struct DisruptionsSpecificOpts {
#[serde(rename = "disruption_status")]
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<DisruptionStatus>,
}
#[derive(ToAndFro, PartialOrd, Ord)]
#[input_case("lower")]
#[output_case("lower")]
pub enum DisruptionStatus {
Current,
Planned,
}
impl Serialize for DisruptionStatus {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(&self.to_string())
}
}
impl<'de> Deserialize<'de> for DisruptionStatus {
fn deserialize<D>(deserializer: D) -> Result<DisruptionStatus, D::Error>
where
D: serde::Deserializer<'de>,
{
let value = String::deserialize(deserializer)?.to_lowercase();
Self::from_str(&value).map_err(serde::de::Error::custom)
}
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct DisruptionsResponse {
pub disruptions: Disruptions,
pub status: Status,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Disruptions {
pub general: Vec<Disruption>,
pub metro_train: Vec<Disruption>,
pub metro_tram: Vec<Disruption>,
pub metro_bus: Vec<Disruption>,
pub regional_train: Vec<Disruption>,
pub regional_coach: Vec<Disruption>,
pub regional_bus: Vec<Disruption>,
pub school_bus: Vec<Disruption>,
pub telebus: Vec<Disruption>,
pub night_bus: Vec<Disruption>,
pub ferry: Vec<Disruption>,
pub interstate_train: Vec<Disruption>,
pub skybus: Vec<Disruption>,
pub taxi: Vec<Disruption>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Disruption {
pub disruption_id: DisruptionId,
pub title: String,
pub url: String,
pub description: String,
pub disruption_status: DisruptionStatus, pub disruption_type: String,
#[serde(deserialize_with = "de_rfc3339")]
#[serde(serialize_with = "ser_rfc3339")]
pub published_on: NaiveDateTime,
#[serde(deserialize_with = "de_rfc3339")]
#[serde(serialize_with = "ser_rfc3339")]
pub last_updated: NaiveDateTime,
#[serde(deserialize_with = "de_rfc3339")]
#[serde(serialize_with = "ser_rfc3339")]
pub from_date: NaiveDateTime,
#[serde(deserialize_with = "opt_de_rfc3339")]
#[serde(serialize_with = "opt_ser_rfc3339")]
pub to_date: Option<NaiveDateTime>,
pub routes: Vec<DisruptionRoute>,
pub stops: Vec<DisruptionStop>,
pub colour: String,
pub display_on_board: bool,
pub display_status: bool,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct DisruptionStop {
#[serde(rename = "stop_id")]
pub id: StopId,
#[serde(rename = "stop_name")]
pub name: String,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct DisruptionRoute {
#[serde(flatten)]
pub route: Route,
pub direction: Option<DisruptionDirection>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct DisruptionDirection {
#[serde(rename = "route_direction_id")]
pub combination_id: i32,
#[serde(rename = "direction_id")]
pub id: DirectionId,
#[serde(rename = "direction_name")]
pub name: String,
#[serde(deserialize_with = "de_service_time")]
pub service_time: Option<NaiveDateTime>,
}
#[derive(Serialize, Default)]
pub struct FareEstimateOpts {
#[serde(serialize_with = "ser_touch_utc")]
#[serde(rename = "journey_touch_on_utc")]
#[serde(skip_serializing_if = "Option::is_none")]
pub touch_on: Option<NaiveDateTime>,
#[serde(serialize_with = "ser_touch_utc")]
#[serde(rename = "journey_touch_off_utc")]
#[serde(skip_serializing_if = "Option::is_none")]
pub touch_off: Option<NaiveDateTime>,
#[serde(rename = "is_journey_in_free_tram_zone")]
#[serde(skip_serializing_if = "Option::is_none")]
pub free_tram_zone: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub traveled_route_types: Option<Vec<RouteType>>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[serde(rename_all = "PascalCase")]
pub struct FareEstimateResponse {
pub fare_estimate_result: FareEstimate,
pub fare_estimate_status: Status,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[serde(rename_all = "PascalCase")]
pub struct ZoneInfo {
pub min_zone: i32,
pub max_zone: i32,
pub unique_zones: Vec<i32>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[serde(rename_all = "camelCase")]
pub enum PassengerType {
Senior,
Concession,
FullFare,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[serde(rename_all = "PascalCase")]
pub struct PassengerFare {
pub passenger_type: PassengerType,
pub fare2_hour_off_peak: Decimal,
pub fare2_hour_peak: Decimal,
pub fare_daily_peak: Decimal,
pub fare_daily_off_peak: Decimal,
pub pass7_days: Decimal,
pub pass28_to69_day_per_day: Decimal,
pub pass70_plus_day_per_day: Decimal,
pub weekend_cap: Decimal,
pub holiday_cap: Decimal,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[serde(rename_all = "PascalCase")]
pub struct FareEstimate {
pub is_early_bird: bool,
pub is_journey_in_free_tram_zone: Option<bool>,
pub is_this_weekend_journey: Option<bool>,
pub zone_info: ZoneInfo,
pub passenger_fares: Vec<PassengerFare>,
}
#[derive(Serialize, Default)]
pub struct OutletsOpts {
#[serde(skip_serializing_if = "Option::is_none")]
pub max_results: Option<i32>,
}
#[derive(Serialize, Default)]
pub struct OutletsLatLongOpts {
#[serde(skip_serializing_if = "Option::is_none")]
pub max_results: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_distance: Option<i32>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct OutletsResponse {
pub outlets: Vec<Outlet>,
pub status: Status,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Outlet {
#[serde(rename = "outlet_slid_spid")]
pub id: String,
#[serde(rename = "outlet_name")]
pub name: String,
#[serde(rename = "outlet_business")]
pub business: String,
#[serde(rename = "outlet_latitude")]
pub latitude: Decimal,
#[serde(rename = "outlet_longitude")]
pub longitude: Decimal,
#[serde(rename = "outlet_suburb")]
pub suburb: String,
#[serde(rename = "outlet_postcode")]
pub postcode: usize,
#[serde(rename = "outlet_business_hour_mon")]
pub hours_monday: Option<String>,
#[serde(rename = "outlet_business_hour_tue")]
pub hours_tuesday: Option<String>,
#[serde(rename = "outlet_business_hour_wed")]
pub hours_wednesday: Option<String>,
#[serde(rename = "outlet_business_hour_thu")]
pub hours_thursday: Option<String>,
#[serde(rename = "outlet_business_hour_fri")]
pub hours_friday: Option<String>,
#[serde(rename = "outlet_business_hour_sat")]
pub hours_saturday: Option<String>,
#[serde(rename = "outlet_business_hour_sun")]
pub hours_sunday: Option<String>,
#[serde(rename = "outlet_notes")]
pub note: Option<String>,
}
#[derive(Serialize, Default)]
pub struct PatternsRunRouteOpts {
#[serde(skip_serializing_if = "Option::is_none")]
pub expand: Option<Vec<ExpandOptions>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stop_id: Option<StopId>,
#[serde(serialize_with = "ser_iso_8601")]
#[serde(rename = "date_utc")]
#[serde(skip_serializing_if = "Option::is_none")]
pub date: Option<NaiveDateTime>,
#[serde(rename = "include_skipped_stops")]
#[serde(skip_serializing_if = "Option::is_none")]
pub include_skipped: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_geopath: Option<bool>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq)] pub struct PatternResponse {
pub disruptions: Vec<Disruption>,
pub departures: Vec<Departure>,
pub stops: BTreeMap<String, StoppingPatternsStop>,
pub routes: BTreeMap<String, Value>, pub runs: BTreeMap<String, Run>,
pub directions: BTreeMap<String, Direction>,
pub status: Status,
}
#[derive(Serialize, Default)]
pub struct RouteOpts {
#[serde(skip_serializing_if = "Option::is_none")]
pub route_types: Option<Vec<RouteType>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub route_name: Option<String>,
}
#[derive(Serialize, Default)]
pub struct RouteIdOpts {
#[serde(skip_serializing_if = "Option::is_none")]
pub include_geopath: Option<bool>,
#[serde(serialize_with = "ser_iso_8601")]
#[serde(skip_serializing_if = "Option::is_none")]
pub date: Option<NaiveDateTime>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct RoutesResponse {
pub routes: Vec<RouteWithStatus>,
pub status: Status,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct RoutesIdResponse {
pub route: Option<RouteWithStatus>,
pub status: Status,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct RouteWithStatus {
#[serde(rename = "route_service_status")]
pub service_status: RouteServiceStatus,
#[serde(flatten)]
pub route: RouteWithGeoPath,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct RouteServiceStatus {
pub description: String,
pub timestamp: String, }
#[derive(Serialize, Default)]
pub struct RunsIdOpts {
#[serde(skip_serializing_if = "Option::is_none")]
pub expand: Option<Vec<ExpandOptions>>,
#[serde(serialize_with = "ser_iso_8601")]
#[serde(rename = "date_utc")]
#[serde(skip_serializing_if = "Option::is_none")]
pub date: Option<NaiveDateTime>,
}
#[derive(Serialize, Default)]
pub struct RunsRefOpts {
#[serde(skip_serializing_if = "Option::is_none")]
pub expand: Option<Vec<ExpandOptions>>,
#[serde(serialize_with = "ser_iso_8601")]
#[serde(rename = "date_utc")]
#[serde(skip_serializing_if = "Option::is_none")]
pub date: Option<NaiveDateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_geopath: Option<bool>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct RunsResponse {
pub runs: Vec<Run>,
pub status: Status,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Run {
pub run_id: RunId,
pub run_ref: String,
pub route_id: RouteId,
pub route_type: RouteType,
pub final_stop_id: StopId,
pub destination_name: String,
pub status: String,
pub direction_id: DirectionId,
pub run_sequence: i32,
pub express_stop_count: i32,
pub vehicle_position: Option<VehiclePosition>,
pub vehicle_descriptor: Option<VehicleDescriptor>,
pub geopath: Vec<Geopath>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct VehiclePosition {
pub latitude: Option<Decimal>,
pub longitude: Option<Decimal>,
pub easting: Option<Decimal>,
pub northing: Option<Decimal>,
pub direction: Option<String>,
pub bearing: Option<Decimal>,
pub supplier: String,
#[serde(deserialize_with = "de_iso_8601")]
#[serde(rename = "datetime_utc")]
pub datetime: NaiveDateTime,
pub expiry_time: Option<String>, }
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum ServiceOperator {
#[serde(rename = "Metro Trains Melbourne")]
MetroTrainsMelbourne,
#[serde(rename = "Yarra Trams")]
YarraTrams,
#[serde(rename = "Ventura Bus Line")]
VenturaBusLine,
Other(String),
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct VehicleDescriptor {
pub operator: Option<ServiceOperator>,
pub id: Option<String>,
pub low_floor: Option<bool>,
pub air_conditioned: Option<bool>,
pub description: Option<String>,
pub supplier: String,
pub length: Option<String>,
}
#[derive(Serialize, Default)]
pub struct SearchOpts {
#[serde(skip_serializing_if = "Option::is_none")]
pub route_types: Option<Vec<RouteType>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub latitude: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none")]
pub longitude: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_distance: Option<Decimal>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_addresses: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_outlets: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub match_stop_by_suburb: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub match_stop_by_gtfs_stop_id: Option<bool>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct ResultStop {
#[serde(flatten)]
pub stop: Stop,
pub routes: Vec<RouteWithStatus>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct SearchResponse {
pub stops: Vec<ResultStop>,
pub routes: Vec<RouteWithStatus>,
pub outlets: Vec<Outlet>,
pub status: Status,
}
#[derive(Serialize, Default)]
pub struct StopsIdRouteTypeOpts {
#[serde(rename = "stop_location")]
#[serde(skip_serializing_if = "Option::is_none")]
pub location: Option<bool>,
#[serde(rename = "stop_amenities")]
#[serde(skip_serializing_if = "Option::is_none")]
pub amenities: Option<bool>,
#[serde(rename = "stop_accessibility")]
#[serde(skip_serializing_if = "Option::is_none")]
pub accessibility: Option<bool>,
#[serde(rename = "stop_contact")]
#[serde(skip_serializing_if = "Option::is_none")]
pub contact: Option<bool>,
#[serde(rename = "stop_ticket")]
#[serde(skip_serializing_if = "Option::is_none")]
pub ticket: Option<bool>,
#[serde(rename = "stop_staffing")]
#[serde(skip_serializing_if = "Option::is_none")]
pub staffing: Option<bool>,
#[serde(rename = "stop_disruptions")]
#[serde(skip_serializing_if = "Option::is_none")]
pub disruptions: Option<bool>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct StopGps {
pub latitude: Decimal,
pub longitude: Decimal,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct StopLocation {
pub gps: StopGps,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct StopAmenityDetails {
pub toilet: bool,
pub taxi_rank: bool,
pub car_parking: bool,
pub cctv: bool,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct StopAccessibilityWheelchair {
pub accessible_ramp: bool,
pub parking: bool,
pub telephone: bool,
pub toilet: bool,
pub low_ticket_counter: bool,
pub manouvering: bool,
pub raised_platform: bool,
pub ramp: bool,
pub secondary_path: bool,
pub raised_platform_shelter: bool,
pub steep_ramp: bool,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct StopAccessibility {
pub lighting: bool,
pub platform_number: bool,
pub escalator: bool,
pub lift: bool,
pub stairs: bool,
pub stop_accessibility: bool,
pub tactile_ground_surface_indicator: bool,
pub waiting_room: bool,
pub wheelchair: StopAccessibilityWheelchair,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct StopStaffing {
pub fri_am_from: String,
pub fri_am_to: String,
pub fri_pm_from: String,
pub fri_pm_to: String,
pub mon_am_from: String,
pub mon_am_to: String,
pub mon_pm_from: String,
pub mon_pm_to: String,
pub ph_additional_text: String,
pub ph_from: String,
pub ph_to: String,
pub sat_am_from: String,
pub sat_am_to: String,
pub sat_pm_from: String,
pub sat_pm_to: String,
pub sun_am_from: String,
pub sun_am_to: String,
pub sun_pm_from: String,
pub sun_pm_to: String,
pub thu_am_from: String,
pub thu_am_to: String,
pub thu_pm_from: String,
pub thu_pm_to: String,
pub tue_am_from: String,
pub tue_am_to: String,
pub tue_pm_from: String,
pub tue_pm_to: String,
pub wed_am_from: String,
pub wed_am_to: String,
pub wed_pm_from: String,
pub wed_pm_to: String,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct StopDetails {
pub disruption_ids: Vec<DisruptionId>,
#[serde(rename = "stop_id")]
pub id: StopId,
pub station_type: String,
pub station_description: String,
pub route_type: RouteType,
pub routes: Vec<Route>,
#[serde(rename = "stop_landmark")]
pub landmark: String,
#[serde(rename = "stop_name")]
pub name: String,
#[serde(rename = "stop_amenities")]
pub amenities: Option<StopAmenityDetails>,
#[serde(rename = "stop_accessibility")]
pub accessibility: Option<StopAccessibility>,
#[serde(rename = "stop_staffing")]
pub staffing: Option<StopStaffing>,
#[serde(rename = "stop_location")]
pub location: Option<StopLocation>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct StopResponse {
pub stop: StopDetails,
pub disruptions: Vec<Disruption>,
pub status: Status,
}