From f155df7fc2793d8b10fae080670cd4506dcce7d1 Mon Sep 17 00:00:00 2001 From: andpas Date: Tue, 19 Sep 2023 14:52:43 +0200 Subject: [PATCH 01/11] Not-quite-working attempt #1 at transportation module. --- Cargo.toml | 1 + src/main.rs | 4 + src/resources/journey-planner_query.graphql | 34 + src/resources/journey-planner_schema.json | 13663 ++++++++++++++++++ src/transportation.rs | 45 + 5 files changed, 13747 insertions(+) create mode 100644 src/resources/journey-planner_query.graphql create mode 100644 src/resources/journey-planner_schema.json create mode 100644 src/transportation.rs diff --git a/Cargo.toml b/Cargo.toml index 45e5cc3..a1a791a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ reqwest = { version = "0.11.23", features = [ "json", "rustls-tls", ], default-features = false } +graphql_client = { version = "0.13.0", features = ["reqwest-blocking"] } serde = { version = "1.0.183", features = ["derive"] } serde_json = "1.0.104" serde_with = "3.4.0" diff --git a/src/main.rs b/src/main.rs index db0c2fa..a1a8c0e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,7 @@ use log::info; use rust_embed::RustEmbed; use slint::PlatformError; use ui::*; +use crate::transportation::test_graph_ql; mod calendar; mod datetime; @@ -9,6 +10,7 @@ mod food; mod forecast; mod selfie; mod xkcd; +mod transportation; pub mod ui { slint::include_modules!(); @@ -23,6 +25,8 @@ fn main() -> Result<(), PlatformError> { env_logger::init(); info!("Starting up..."); + test_graph_ql(); + let main_window = MainWindow::new().unwrap(); forecast::setup(&main_window); xkcd::setup(&main_window); diff --git a/src/resources/journey-planner_query.graphql b/src/resources/journey-planner_query.graphql new file mode 100644 index 0000000..a6a40b8 --- /dev/null +++ b/src/resources/journey-planner_query.graphql @@ -0,0 +1,34 @@ +query StopPlace($id: String!, $timeRange: Int, $numberOfDepartures: Int) { + stopPlace(id: $id) { + id + name + estimatedCalls(timeRange: $timeRange, numberOfDepartures: $numberOfDepartures) { + realtime + aimedArrivalTime + aimedDepartureTime + expectedArrivalTime + expectedDepartureTime + actualArrivalTime + actualDepartureTime + date + forBoarding + forAlighting + destinationDisplay { + frontText + via + } + serviceJourney { + directionType + publicCode + journeyPattern { + line { + id + name + transportMode + publicCode + } + } + } + } + } +} \ No newline at end of file diff --git a/src/resources/journey-planner_schema.json b/src/resources/journey-planner_schema.json new file mode 100644 index 0000000..52a1fe2 --- /dev/null +++ b/src/resources/journey-planner_schema.json @@ -0,0 +1,13663 @@ +{ + "data": { + "__schema": { + "directives": [ + { + "args": [ + { + "defaultValue": null, + "description": "Included when true.", + "name": "if", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + } + ], + "description": "Directs the executor to include this field or fragment only when the `if` argument is true", + "locations": [ + "FIELD", + "FRAGMENT_SPREAD", + "INLINE_FRAGMENT" + ], + "name": "include" + }, + { + "args": [ + { + "defaultValue": null, + "description": "Skipped when true.", + "name": "if", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + } + ], + "description": "Directs the executor to skip this field or fragment when the `if` argument is true.", + "locations": [ + "FIELD", + "FRAGMENT_SPREAD", + "INLINE_FRAGMENT" + ], + "name": "skip" + }, + { + "args": [], + "description": "Add timing data to prometheus, if Actuator API is enabled", + "locations": [ + "FIELD_DEFINITION" + ], + "name": "timingData" + }, + { + "args": [ + { + "defaultValue": "\"No longer supported\"", + "description": "The reason for the deprecation", + "name": "reason", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "description": "Marks the field, argument, input field or enum value as deprecated", + "locations": [ + "FIELD_DEFINITION", + "ARGUMENT_DEFINITION", + "ENUM_VALUE", + "INPUT_FIELD_DEFINITION" + ], + "name": "deprecated" + }, + { + "args": [ + { + "defaultValue": null, + "description": "The URL that specifies the behaviour of this scalar.", + "name": "url", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "description": "Exposes a URL that specifies the behaviour of this scalar.", + "locations": [ + "SCALAR" + ], + "name": "specifiedBy" + } + ], + "mutationType": null, + "queryType": { + "name": "QueryType" + }, + "subscriptionType": null, + "types": [ + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "north" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "northeast" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "east" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "southeast" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "south" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "southwest" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "west" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "northwest" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "AbsoluteDirection", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "line", + "type": { + "kind": "OBJECT", + "name": "Line", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "AffectedLine", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "serviceJourney", + "type": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "operatingDay", + "type": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "datedServiceJourney", + "type": { + "kind": "OBJECT", + "name": "DatedServiceJourney", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "AffectedServiceJourney", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "quay", + "type": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "stopPlace", + "type": { + "kind": "OBJECT", + "name": "StopPlace", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "stopConditions", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "StopCondition", + "ofType": null + } + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "AffectedStopPlace", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "quay", + "type": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "stopPlace", + "type": { + "kind": "OBJECT", + "name": "StopPlace", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "line", + "type": { + "kind": "OBJECT", + "name": "Line", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "stopConditions", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "StopCondition", + "ofType": null + } + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "AffectedStopPlaceOnLine", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "quay", + "type": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "stopPlace", + "type": { + "kind": "OBJECT", + "name": "StopPlace", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "serviceJourney", + "type": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "operatingDay", + "type": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "datedServiceJourney", + "type": { + "kind": "OBJECT", + "name": "DatedServiceJourney", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "stopConditions", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "StopCondition", + "ofType": null + } + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "AffectedStopPlaceOnServiceJourney", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "AffectedUnknown", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "UNION", + "name": "Affects", + "possibleTypes": [ + { + "kind": "OBJECT", + "name": "AffectedStopPlace", + "ofType": null + }, + { + "kind": "OBJECT", + "name": "AffectedLine", + "ofType": null + }, + { + "kind": "OBJECT", + "name": "AffectedServiceJourney", + "ofType": null + }, + { + "kind": "OBJECT", + "name": "AffectedStopPlaceOnLine", + "ofType": null + }, + { + "kind": "OBJECT", + "name": "AffectedStopPlaceOnServiceJourney", + "ofType": null + }, + { + "kind": "OBJECT", + "name": "AffectedUnknown", + "ofType": null + } + ] + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "noFilter" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "sameAuthority" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "sameMode" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "sameLine" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "AlternativeLegsFilter", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": "Only show arrivals", + "isDeprecated": false, + "name": "arrivals" + }, + { + "deprecationReason": null, + "description": "Only show departures", + "isDeprecated": false, + "name": "departures" + }, + { + "deprecationReason": null, + "description": "Show both arrivals and departures", + "isDeprecated": false, + "name": "both" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "ArrivalDeparture", + "possibleTypes": null + }, + { + "description": "Authority involved in public transportation. An organisation under which the responsibility of organising the transport service in a certain area is placed.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "url", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "timezone", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "lang", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "phone", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "fareUrl", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "lines", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Line", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get all situations active for the authority.", + "isDeprecated": false, + "name": "situations", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PtSituationElement", + "ofType": null + } + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "Authority", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "quick" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "safe" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "flat" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "greenways" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "triangle" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "BicycleOptimisationMethod", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "spacesAvailable", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "realtime", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "longitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "latitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "PlaceInterface", + "ofType": null + } + ], + "kind": "OBJECT", + "name": "BikePark", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "bikesAvailable", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "spacesAvailable", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "realtimeOccupancyAvailable", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "allowDropoff", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "networks", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "longitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "latitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "PlaceInterface", + "ofType": null + } + ], + "kind": "OBJECT", + "name": "BikeRentalStation", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": "There is no bike information for the trip.", + "isDeprecated": false, + "name": "noInformation" + }, + { + "deprecationReason": null, + "description": "The vehicle being used on this particular trip can accommodate at least one bicycle.", + "isDeprecated": false, + "name": "allowed" + }, + { + "deprecationReason": null, + "description": "No bicycles are allowed on this trip.", + "isDeprecated": false, + "name": "notAllowed" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "BikesAllowed", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "How should service be booked?", + "isDeprecated": false, + "name": "bookingMethods", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "BookingMethod", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Latest time the service can be booked. ISO 8601 timestamp", + "isDeprecated": false, + "name": "latestBookingTime", + "type": { + "kind": "SCALAR", + "name": "LocalTime", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "How many days prior to the travel the service needs to be booked", + "isDeprecated": false, + "name": "latestBookingDay", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Time constraints for booking", + "isDeprecated": false, + "name": "bookWhen", + "type": { + "kind": "ENUM", + "name": "PurchaseWhen", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Minimum period in advance service can be booked as a ISO 8601 duration", + "isDeprecated": false, + "name": "minimumBookingPeriod", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Textual description of booking arrangement for service", + "isDeprecated": false, + "name": "bookingNote", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Who should ticket be contacted for booking", + "isDeprecated": false, + "name": "bookingContact", + "type": { + "kind": "OBJECT", + "name": "Contact", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "BookingArrangement", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "callDriver" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "callOffice" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "online" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "phoneAtStop" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "text" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "BookingMethod", + "possibleTypes": null + }, + { + "description": "Built-in Boolean", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "Boolean", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Full name to be used for branding.", + "isDeprecated": false, + "name": "name", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Short name to be used for branding.", + "isDeprecated": false, + "name": "shortName", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Description of branding.", + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "URL to be used for branding", + "isDeprecated": false, + "name": "url", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "URL to an image be used for branding", + "isDeprecated": false, + "name": "image", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "Branding", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "Name of person to contact", + "isDeprecated": false, + "name": "contactPerson", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Email adress for contact", + "isDeprecated": false, + "name": "email", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Url for contact", + "isDeprecated": false, + "name": "url", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Phone number for contact", + "isDeprecated": false, + "name": "phone", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Textual description of how to get in contact", + "isDeprecated": false, + "name": "furtherDetails", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "Contact", + "possibleTypes": null + }, + { + "description": "List of coordinates like: [[60.89, 11.12], [62.56, 12.10]]", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "Coordinates", + "possibleTypes": null + }, + { + "description": "Local date using the ISO 8601 format: `YYYY-MM-DD`. Example: `2020-05-17`.", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "Date", + "possibleTypes": null + }, + { + "description": "DateTime format accepting ISO 8601 dates with time zone offset.\n\nFormat: `YYYY-MM-DD'T'hh:mm[:ss](Z|±01:00)`\n\nExample: `2017-04-23T18:25:43+02:00` or `2017-04-23T16:25:43Z`", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "DateTime", + "possibleTypes": null + }, + { + "description": "A planned journey on a specific day", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The date this service runs. The date used is based on the service date as opposed to calendar date.", + "isDeprecated": false, + "name": "operatingDay", + "type": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The service journey this Dated Service Journey is based on", + "isDeprecated": false, + "name": "serviceJourney", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Alterations specified on the Trip in the planned data", + "isDeprecated": false, + "name": "tripAlteration", + "type": { + "kind": "ENUM", + "name": "ServiceAlteration", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "List of the dated service journeys this dated service journeys replaces", + "isDeprecated": false, + "name": "replacementFor", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "DatedServiceJourney", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "JourneyPattern for the dated service journey.", + "isDeprecated": false, + "name": "journeyPattern", + "type": { + "kind": "OBJECT", + "name": "JourneyPattern", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": null, + "description": "Only fetch the first n quays on the service journey", + "name": "first", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Only fetch the last n quays on the service journey", + "name": "last", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Quays visited by the dated service journey.", + "isDeprecated": false, + "name": "quays", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Returns scheduled passingTimes for this dated service journey, updated with realtime-updates (if available). ", + "isDeprecated": false, + "name": "estimatedCalls", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "EstimatedCall", + "ofType": null + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "DatedServiceJourney", + "possibleTypes": null + }, + { + "description": "An advertised destination of a specific journey pattern, usually displayed on a head sign or at other on-board locations.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "Name of destination to show on front of vehicle.", + "isDeprecated": false, + "name": "frontText", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Intermediary destinations which the vehicle will pass before reaching its final destination.", + "isDeprecated": false, + "name": "via", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "DestinationDisplay", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "unknown" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "outbound" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "inbound" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "clockwise" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "anticlockwise" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "DirectionType", + "possibleTypes": null + }, + { + "description": "A linear function to calculate a value(y) based on a parameter (x): `y = f(x) = a + bx`. It allows setting both a constant(a) and a coefficient(b) and the use those in the computation. Format: `a + b x`. Example: `1800 + 2.0 x`", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "DoubleFunction", + "possibleTypes": null + }, + { + "description": "Duration in a lenient ISO-8601 duration format. Example P2DT2H12M40S, 2d2h12m40s or 1h", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "Duration", + "possibleTypes": null + }, + { + "description": "Individual step of an elevation profile.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "The horizontal distance from the start of the step, in meters.", + "isDeprecated": false, + "name": "distance", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The elevation at this distance, in meters above sea level. It is negative if the\nlocation is below sea level.\n", + "isDeprecated": false, + "name": "elevation", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "ElevationProfileStep", + "possibleTypes": null + }, + { + "description": "List of visits to quays as part of vehicle journeys. Updated with real time information where available", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "quay", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Scheduled time of arrival at quay. Not affected by read time updated", + "isDeprecated": false, + "name": "aimedArrivalTime", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Expected time of arrival at quay. Updated with real time information if available. Will be null if an actualArrivalTime exists", + "isDeprecated": false, + "name": "expectedArrivalTime", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Actual time of arrival at quay. Updated from real time information if available.", + "isDeprecated": false, + "name": "actualArrivalTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Scheduled time of departure from quay. Not affected by read time updated", + "isDeprecated": false, + "name": "aimedDepartureTime", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Expected time of departure from quay. Updated with real time information if available. Will be null if an actualDepartureTime exists", + "isDeprecated": false, + "name": "expectedDepartureTime", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Actual time of departure from quay. Updated with real time information if available.", + "isDeprecated": false, + "name": "actualDepartureTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether this is a timing point or not. Boarding and alighting is not allowed at timing points.", + "isDeprecated": false, + "name": "timingPoint", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether this call has been updated with real time information.", + "isDeprecated": false, + "name": "realtime", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether the updated estimates are expected to be inaccurate.", + "isDeprecated": false, + "name": "predictionInaccurate", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "realtimeState", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "RealtimeState", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "occupancyStatus", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "OccupancyStatus", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "stopPositionInPattern", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether vehicle may be boarded at quay.", + "isDeprecated": false, + "name": "forBoarding", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether vehicle may be alighted at quay.", + "isDeprecated": false, + "name": "forAlighting", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether vehicle will only stop on request.", + "isDeprecated": false, + "name": "requestStop", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether stop is cancelled. This means that either the ServiceJourney has a planned cancellation, the ServiceJourney has been cancelled by realtime data, or this particular StopPoint has been cancelled. This also means that both boarding and alighting has been cancelled.", + "isDeprecated": false, + "name": "cancellation", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The date the estimated call is valid for.", + "isDeprecated": false, + "name": "date", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "serviceJourney", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "datedServiceJourney", + "type": { + "kind": "OBJECT", + "name": "DatedServiceJourney", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "destinationDisplay", + "type": { + "kind": "OBJECT", + "name": "DestinationDisplay", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "notices", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Notice", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get all relevant situations for this EstimatedCall.", + "isDeprecated": false, + "name": "situations", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PtSituationElement", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Booking arrangements for this EstimatedCall.", + "isDeprecated": false, + "name": "bookingArrangements", + "type": { + "kind": "OBJECT", + "name": "BookingArrangement", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "EstimatedCall", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": "Quay", + "isDeprecated": false, + "name": "quay" + }, + { + "deprecationReason": null, + "description": "StopPlace", + "isDeprecated": false, + "name": "stopPlace" + }, + { + "deprecationReason": null, + "description": "Bicycle rent stations", + "isDeprecated": false, + "name": "bicycleRent" + }, + { + "deprecationReason": null, + "description": "Bike parks", + "isDeprecated": false, + "name": "bikePark" + }, + { + "deprecationReason": null, + "description": "Car parks", + "isDeprecated": false, + "name": "carPark" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "FilterPlaceType", + "possibleTypes": null + }, + { + "description": "Built-in Float", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "Float", + "possibleTypes": null + }, + { + "description": "Additional (optional) grouping of lines for particular purposes such as e.g. fare harmonisation or public presentation.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "For internal use by operator/authority.", + "isDeprecated": false, + "name": "privateCode", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Short name for group of lines.", + "isDeprecated": false, + "name": "shortName", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Full name for group of lines.", + "isDeprecated": false, + "name": "name", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Description of group of lines", + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "All lines part of this group of lines", + "isDeprecated": false, + "name": "lines", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Line", + "ofType": null + } + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "GroupOfLines", + "possibleTypes": null + }, + { + "description": "Built-in ID", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "ID", + "possibleTypes": null + }, + { + "description": "Filter trips by disallowing lines involving certain elements. If both lines and authorities are specified, only one must be valid for each line to be banned. If a line is both banned and whitelisted, it will be counted as banned.", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": "[]", + "description": "Set of ids for lines that should not be used", + "name": "lines", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "defaultValue": "[]", + "description": "Set of ids for authorities that should not be used", + "name": "authorities", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "defaultValue": "[]", + "description": "NOT IMPLEMENTED. Set of ids of quays that should not be allowed for boarding or alighting. Trip patterns that travel through the quay will still be permitted.", + "name": "quays", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "defaultValue": "[]", + "description": "NOT IMPLEMENTED. Set of ids of quays that should not be allowed for boarding, alighting or traveling thorugh.", + "name": "quaysHard", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "defaultValue": "[]", + "description": "Set of ids of service journeys that should not be used.", + "name": "serviceJourneys", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "defaultValue": "[]", + "description": "Set of ids of rental networks that should not be allowed for renting vehicles.", + "name": "rentalNetworks", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "InputBanned", + "possibleTypes": null + }, + { + "description": "Input type for coordinates in the WGS84 system", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "The latitude of the place.", + "name": "latitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "The longitude of the place.", + "name": "longitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "InputCoordinates", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "dateTime" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "from" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "to" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "intermediatePlace" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "InputField", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "Quays to include by id.", + "name": "quays", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Lines to include by id.", + "name": "lines", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Bike rentals to include by id.", + "name": "bikeRentalStations", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Bike parks to include by id.", + "name": "bikeParks", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Car parks to include by id.", + "name": "carParks", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "InputPlaceIds", + "possibleTypes": null + }, + { + "description": "Filter trips by only allowing lines involving certain elements. If both lines and authorities are specified, only one must be valid for each line to be used. If a line is both banned and whitelisted, it will be counted as banned.", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": "[]", + "description": "Set of ids for lines that should be used", + "name": "lines", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "defaultValue": "[]", + "description": "Set of ids for authorities that should be used", + "name": "authorities", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "defaultValue": "[]", + "description": "Set of ids of rental networks that should be used for renting vehicles.", + "name": "rentalNetworks", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "InputWhiteListed", + "possibleTypes": null + }, + { + "description": "Built-in Int", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "Int", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "staySeated", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "guaranteed", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The transfer priority is used to decide where a transfer should happen, at the highest prioritized location. If the guaranteed flag is set it take precedence priority. A guaranteed ALLOWED transfer is preferred over a PREFERRED none-guaranteed transfer.", + "isDeprecated": false, + "name": "priority", + "type": { + "kind": "ENUM", + "name": "InterchangePriority", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Maximum time after scheduled departure time the connecting transport is guaranteed to wait for the delayed trip. [NOT RESPECTED DURING ROUTING, JUST PASSED THROUGH]", + "isDeprecated": false, + "name": "maximumWaitTime", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "This is the same as using the `fromServiceJourney { line }` field.", + "description": null, + "isDeprecated": true, + "name": "FromLine", + "type": { + "kind": "OBJECT", + "name": "Line", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "This is the same as using the `toServiceJourney { line }` field.", + "description": null, + "isDeprecated": true, + "name": "ToLine", + "type": { + "kind": "OBJECT", + "name": "Line", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "fromServiceJourney", + "type": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "toServiceJourney", + "type": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "Use fromServiceJourney instead", + "description": null, + "isDeprecated": true, + "name": "FromServiceJourney", + "type": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "Use toServiceJourney instead", + "description": null, + "isDeprecated": true, + "name": "ToServiceJourney", + "type": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "Interchange", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "preferred" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "recommended" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "allowed" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "notAllowed" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "InterchangePriority", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": "Highest priority interchange.", + "isDeprecated": false, + "name": "preferredInterchange" + }, + { + "deprecationReason": null, + "description": "Second highest priority interchange.", + "isDeprecated": false, + "name": "recommendedInterchange" + }, + { + "deprecationReason": null, + "description": "Third highest priority interchange.", + "isDeprecated": false, + "name": "interchangeAllowed" + }, + { + "deprecationReason": null, + "description": "Interchange not allowed.", + "isDeprecated": false, + "name": "noInterchange" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "InterchangeWeighting", + "possibleTypes": null + }, + { + "description": "Enable this to attach a system notice to itineraries instead of removing them. This is very\nconvenient when tuning the itinerary-filter-chain.", + "enumValues": [ + { + "deprecationReason": null, + "description": "By default, the debug itinerary filters is turned off.", + "isDeprecated": false, + "name": "off" + }, + { + "deprecationReason": null, + "description": "List all itineraries, including all deleted itineraries.", + "isDeprecated": false, + "name": "listAll" + }, + { + "deprecationReason": null, + "description": "Return all itineraries, including deleted ones, inside the actual search-window used\n(the requested search-window may differ).", + "isDeprecated": false, + "name": "limitToSearchWindow" + }, + { + "deprecationReason": null, + "description": "Only return the requested number of itineraries, counting both actual and deleted ones.\nThe top `numItineraries` using the request sort order is returned. This does not work\nwith paging, itineraries after the limit, but inside the search-window are skipped when\nmoving to the next page.", + "isDeprecated": false, + "name": "limitToNumOfItineraries" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "ItineraryFilterDebugProfile", + "possibleTypes": null + }, + { + "description": "Parameters for the OTP Itinerary Filter Chain. These parameters SHOULD be configured on the server side and should not be used by the client. They are made available here to be able to experiment and tune the server.", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "Set a relative limit for all transit itineraries. The limit is calculated based on the transit itinerary generalized-cost and the time between itineraries Itineraries without transit legs are excluded from this filter. Example: costLimitFunction(x) = 3600 + 2.0 x and intervalRelaxFactor = 0.5. If the lowest cost returned is 10 000, then the limit is set to: 3 600 + 2 * 10 000 = 26 600 plus half of the time between either departure or arrival times of the itinerary. Default: {\"costLimitFunction\": 900.0 + 1.5 x, \"intervalRelaxFactor\": 0.75}", + "name": "transitGeneralizedCostLimit", + "type": { + "kind": "INPUT_OBJECT", + "name": "TransitGeneralizedCostFilterParams", + "ofType": null + } + }, + { + "defaultValue": "0.85", + "description": "Pick ONE itinerary from each group after putting itineraries that is 85% similar together.", + "name": "groupSimilarityKeepOne", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "defaultValue": "0.68", + "description": "Reduce the number of itineraries in each group to to maximum 3 itineraries. The itineraries are grouped by similar legs (on board same journey). So, if 68% of the distance is traveled by similar legs, then two itineraries are in the same group. Default value is 68%, must be at least 50%.", + "name": "groupSimilarityKeepThree", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "defaultValue": "2.0", + "description": "Of the itineraries grouped to maximum of three itineraries, how much worse can the non-grouped legs be compared to the lowest cost. 2.0 means that they can be double the cost, and any itineraries having a higher cost will be filtered. Default value is 2.0, use a value lower than 1.0 to turn off", + "name": "groupedOtherThanSameLegsMaxCostMultiplier", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "defaultValue": "off", + "description": "Use this parameter to debug the itinerary-filter-chain. The default is `off`\n(itineraries are filtered and not returned). For all other values the unwanted\nitineraries are returned with a system notice, and not deleted.", + "name": "debug", + "type": { + "kind": "ENUM", + "name": "ItineraryFilterDebugProfile", + "ofType": null + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "ItineraryFilters", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "line", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Line", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "directionType", + "type": { + "kind": "ENUM", + "name": "DirectionType", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "serviceJourneys", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "date", + "type": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "List of service journeys for the journey pattern for a given date", + "isDeprecated": false, + "name": "serviceJourneysForDate", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Quays visited by service journeys for this journey patterns", + "isDeprecated": false, + "name": "quays", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "pointsOnLink", + "type": { + "kind": "OBJECT", + "name": "PointsOnLink", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Detailed path travelled by journey pattern divided into stop-to-stop sections.", + "isDeprecated": false, + "name": "stopToStopGeometries", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "StopToStopGeometry", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get all situations active for the journey pattern.", + "isDeprecated": false, + "name": "situations", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PtSituationElement", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "notices", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Notice", + "ofType": null + } + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "JourneyPattern", + "possibleTypes": null + }, + { + "description": "Part of a trip pattern. Either a ride on a public transport vehicle or access or path link to/from/between places", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "An identifier for the leg, which can be used to re-fetch the information.", + "isDeprecated": false, + "name": "id", + "type": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The aimed date and time this leg starts.", + "isDeprecated": false, + "name": "aimedStartTime", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The expected, realtime adjusted date and time this leg starts.", + "isDeprecated": false, + "name": "expectedStartTime", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The aimed date and time this leg ends.", + "isDeprecated": false, + "name": "aimedEndTime", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The expected, realtime adjusted date and time this leg ends.", + "isDeprecated": false, + "name": "expectedEndTime", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The mode of transport or access (e.g., foot) used when traversing this leg.", + "isDeprecated": false, + "name": "mode", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "Mode", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The transport sub mode (e.g., localBus or expressBus) used when traversing this leg. Null if leg is not a ride", + "isDeprecated": false, + "name": "transportSubmode", + "type": { + "kind": "ENUM", + "name": "TransportSubmode", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The leg's duration in seconds", + "isDeprecated": false, + "name": "duration", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Long", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "NOT IMPLEMENTED", + "isDeprecated": false, + "name": "directDuration", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Long", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The leg's geometry.", + "isDeprecated": false, + "name": "pointsOnLink", + "type": { + "kind": "OBJECT", + "name": "PointsOnLink", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "For ride legs, the service authority used for this legs. For non-ride legs, null.", + "isDeprecated": false, + "name": "authority", + "type": { + "kind": "OBJECT", + "name": "Authority", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "For ride legs, the operator used for this legs. For non-ride legs, null.", + "isDeprecated": false, + "name": "operator", + "type": { + "kind": "OBJECT", + "name": "Operator", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether there is real-time data about this leg", + "isDeprecated": false, + "name": "realtime", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The distance traveled while traversing the leg in meters.", + "isDeprecated": false, + "name": "distance", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Generalized cost or weight of the leg. Used for debugging.", + "isDeprecated": false, + "name": "generalizedCost", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether this leg is a ride leg or not.", + "isDeprecated": false, + "name": "ride", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether this leg is walking with a bike.", + "isDeprecated": false, + "name": "walkingBike", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether this leg is with a rented bike.", + "isDeprecated": false, + "name": "rentedBike", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The Place where the leg originates.", + "isDeprecated": false, + "name": "fromPlace", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Place", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The Place where the leg ends.", + "isDeprecated": false, + "name": "toPlace", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Place", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "EstimatedCall for the quay where the leg originates.", + "isDeprecated": false, + "name": "fromEstimatedCall", + "type": { + "kind": "OBJECT", + "name": "EstimatedCall", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "EstimatedCall for the quay where the leg ends.", + "isDeprecated": false, + "name": "toEstimatedCall", + "type": { + "kind": "OBJECT", + "name": "EstimatedCall", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "For ride legs, the line. For non-ride legs, null.", + "isDeprecated": false, + "name": "line", + "type": { + "kind": "OBJECT", + "name": "Line", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "For ride legs, the service journey. For non-ride legs, null.", + "isDeprecated": false, + "name": "serviceJourney", + "type": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The dated service journey used for this leg.", + "isDeprecated": false, + "name": "datedServiceJourney", + "type": { + "kind": "OBJECT", + "name": "DatedServiceJourney", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "For transit legs, the service date of the trip. For non-transit legs, null.", + "isDeprecated": false, + "name": "serviceDate", + "type": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "For ride legs, intermediate quays between the Place where the leg originates and the Place where the leg ends. For non-ride legs, empty list.", + "isDeprecated": false, + "name": "intermediateQuays", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "For ride legs, estimated calls for quays between the Place where the leg originates and the Place where the leg ends. For non-ride legs, empty list.", + "isDeprecated": false, + "name": "intermediateEstimatedCalls", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "EstimatedCall", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "For ride legs, all estimated calls for the service journey. For non-ride legs, empty list.", + "isDeprecated": false, + "name": "serviceJourneyEstimatedCalls", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "EstimatedCall", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "All relevant situations for this leg", + "isDeprecated": false, + "name": "situations", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PtSituationElement", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Do we continue from a specified via place", + "isDeprecated": false, + "name": "steps", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PathGuidance", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "interchangeFrom", + "type": { + "kind": "OBJECT", + "name": "Interchange", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "interchangeTo", + "type": { + "kind": "OBJECT", + "name": "Interchange", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "bookingArrangements", + "type": { + "kind": "OBJECT", + "name": "BookingArrangement", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "bikeRentalNetworks", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The leg's elevation profile. All elevation values, including the first one, are in meters\nabove sea level. The elevation is negative for places below sea level. The profile\nincludes both the start and end coordinate.\n", + "isDeprecated": false, + "name": "elevationProfile", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ElevationProfileStep", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": "1", + "description": "Number of earlier legs to return.", + "name": "previous", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": "noFilter", + "description": "Whether the leg should be similar to this leg in some way.", + "name": "filter", + "type": { + "kind": "ENUM", + "name": "AlternativeLegsFilter", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Fetch the previous legs, which can be used to replace this leg. The replacement legs do arrive/depart from/to the same stop places. It might be necessary to change other legs in an itinerary in order to be able to ride the returned legs.", + "isDeprecated": false, + "name": "previousLegs", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Leg", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": "1", + "description": "Number of later legs to return.", + "name": "next", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": "noFilter", + "description": "Whether the leg should be similar to this leg in some way.", + "name": "filter", + "type": { + "kind": "ENUM", + "name": "AlternativeLegsFilter", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Fetch the next legs, which can be used to replace this leg. The replacement legs do arrive/depart from/to the same stop places. It might be necessary to change other legs in an itinerary in order to be able to ride the returned legs.", + "isDeprecated": false, + "name": "nextLegs", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Leg", + "ofType": null + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "Leg", + "possibleTypes": null + }, + { + "description": "A group of routes which is generally known to the public by a similar name or number", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "authority", + "type": { + "kind": "OBJECT", + "name": "Authority", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "operator", + "type": { + "kind": "OBJECT", + "name": "Operator", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "branding", + "type": { + "kind": "OBJECT", + "name": "Branding", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Publicly announced code for line, differentiating it from other lines for the same operator.", + "isDeprecated": false, + "name": "publicCode", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "transportMode", + "type": { + "kind": "ENUM", + "name": "TransportMode", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "transportSubmode", + "type": { + "kind": "ENUM", + "name": "TransportSubmode", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "url", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "presentation", + "type": { + "kind": "OBJECT", + "name": "Presentation", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "bikesAllowed", + "type": { + "kind": "ENUM", + "name": "BikesAllowed", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "journeyPatterns", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "JourneyPattern", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "quays", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "serviceJourneys", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "notices", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Notice", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get all situations active for the line.", + "isDeprecated": false, + "name": "situations", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PtSituationElement", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Type of flexible line, or null if line is not flexible.", + "isDeprecated": false, + "name": "flexibleLineType", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "BookingArrangements are defined per stop, and can be found under `passingTimes` or `estimatedCalls`", + "description": "Booking arrangements for flexible line.", + "isDeprecated": true, + "name": "bookingArrangements", + "type": { + "kind": "OBJECT", + "name": "BookingArrangement", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Groups of lines that line is a part of.", + "isDeprecated": false, + "name": "groupOfLines", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "GroupOfLines", + "ofType": null + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "Line", + "possibleTypes": null + }, + { + "description": "Time using the format: HH:mm:SS. Example: 18:25:SS", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "LocalTime", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "no" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "us" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "Locale", + "possibleTypes": null + }, + { + "description": "Input format for specifying a location through either a place reference (id), coordinates or both. If both place and coordinates are provided the place ref will be used if found, coordinates will only be used if place is not known.", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "The name of the location. This is pass-through informationand is not used in routing.", + "name": "name", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "The id of an element in the OTP model. Currently supports Quay, StopPlace, multimodal StopPlace, and GroupOfStopPlaces.", + "name": "place", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Coordinates for the location. This can be used alone or as fallback if the place id is not found.", + "name": "coordinates", + "type": { + "kind": "INPUT_OBJECT", + "name": "InputCoordinates", + "ofType": null + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "Location", + "possibleTypes": null + }, + { + "description": "A 64-bit signed integer", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "Long", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "air" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "bicycle" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "bus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "cableway" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "water" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "funicular" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "lift" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "rail" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "metro" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "taxi" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "tram" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "trolleybus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "monorail" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "coach" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "foot" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "car" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "scooter" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "Mode", + "possibleTypes": null + }, + { + "description": "Input format for specifying which modes will be allowed for this search. If this element is not present, it will default to accessMode/egressMode/directMode of foot and all transport modes will be allowed.", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "The mode used to get from the origin to the access stops in the transit network the transit network (first-mile). If the element is not present or null,only transit that can be immediately boarded from the origin will be used.", + "name": "accessMode", + "type": { + "kind": "ENUM", + "name": "StreetMode", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "The mode used to get from the egress stops in the transit network tothe destination (last-mile). If the element is not present or null,only transit that can immediately arrive at the origin will be used.", + "name": "egressMode", + "type": { + "kind": "ENUM", + "name": "StreetMode", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "The mode used to get from the origin to the destination directly, without using the transit network. If the element is not present or null,direct travel without using transit will be disallowed.", + "name": "directMode", + "type": { + "kind": "ENUM", + "name": "StreetMode", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "The allowed modes for the transit part of the trip. Use an empty list to disallow transit for this search. If the element is not present or null, it will default to all transport modes.", + "name": "transportModes", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "TransportModes", + "ofType": null + } + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "Modes", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": "Multi modal parent stop places without their mono modal children.", + "isDeprecated": false, + "name": "parent" + }, + { + "deprecationReason": null, + "description": "Only mono modal children stop places, not their multi modal parent stop", + "isDeprecated": false, + "name": "child" + }, + { + "deprecationReason": null, + "description": "Both multiModal parents and their mono modal child stop places.", + "isDeprecated": false, + "name": "all" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "MultiModalMode", + "possibleTypes": null + }, + { + "description": "Text with language", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "value", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "language", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MultilingualString", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "text", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "publicCode", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "Notice", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": "The vehicle or carriage doesn't have any occupancy data available.", + "isDeprecated": false, + "name": "noData" + }, + { + "deprecationReason": null, + "description": "The vehicle or carriage has a large number of seats available.", + "isDeprecated": false, + "name": "manySeatsAvailable" + }, + { + "deprecationReason": null, + "description": "The vehicle or carriage has a few seats available.", + "isDeprecated": false, + "name": "fewSeatsAvailable" + }, + { + "deprecationReason": null, + "description": "The vehicle or carriage only has standing room available.", + "isDeprecated": false, + "name": "standingRoomOnly" + }, + { + "deprecationReason": null, + "description": "The vehicle or carriage is considered full by most measures, but may still be allowing passengers to board.", + "isDeprecated": false, + "name": "full" + }, + { + "deprecationReason": null, + "description": "The vehicle or carriage has no seats or standing room available.", + "isDeprecated": false, + "name": "notAcceptingPassengers" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "OccupancyStatus", + "possibleTypes": null + }, + { + "description": "Organisation providing public transport services.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "url", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "phone", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "lines", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Line", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "serviceJourney", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "Operator", + "possibleTypes": null + }, + { + "description": "Information about pagination in a connection.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "When paginating forwards, are there more items?", + "isDeprecated": false, + "name": "hasNextPage", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "When paginating backwards, are there more items?", + "isDeprecated": false, + "name": "hasPreviousPage", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "When paginating backwards, the cursor to continue.", + "isDeprecated": false, + "name": "startCursor", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "When paginating forwards, the cursor to continue.", + "isDeprecated": false, + "name": "endCursor", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "PageInfo", + "possibleTypes": null + }, + { + "description": "A series of turn by turn instructions used for walking, biking and driving.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "The distance in meters that this step takes.", + "isDeprecated": false, + "name": "distance", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The relative direction of this step.", + "isDeprecated": false, + "name": "relativeDirection", + "type": { + "kind": "ENUM", + "name": "RelativeDirection", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The name of the street.", + "isDeprecated": false, + "name": "streetName", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The absolute direction of this step.", + "isDeprecated": false, + "name": "heading", + "type": { + "kind": "ENUM", + "name": "AbsoluteDirection", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "When exiting a highway or traffic circle, the exit name/number.", + "isDeprecated": false, + "name": "exit", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Indicates whether or not a street changes direction at an intersection.", + "isDeprecated": false, + "name": "stayOn", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "This step is on an open area, such as a plaza or train platform, and thus the directions should say something like \"cross\"", + "isDeprecated": false, + "name": "area", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The name of this street was generated by the system, so we should only display it once, and generally just display right/left directions", + "isDeprecated": false, + "name": "bogusName", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The latitude of the step.", + "isDeprecated": false, + "name": "latitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The longitude of the step.", + "isDeprecated": false, + "name": "longitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The step's elevation profile. All elevation values, including the first one, are in meters\nabove sea level. The elevation is negative for places below sea level. The profile\nincludes both the start and end coordinate.\n", + "isDeprecated": false, + "name": "elevationProfile", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ElevationProfileStep", + "ofType": null + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "PathGuidance", + "possibleTypes": null + }, + { + "description": "Common super class for all places (stop places, quays, car parks, bike parks and bike rental stations )", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "For transit quays, the name of the quay. For points of interest, the name of the POI.", + "isDeprecated": false, + "name": "name", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Type of vertex. (Normal, Bike sharing station, Bike P+R, Transit quay) Mostly used for better localization of bike sharing and P+R station names", + "isDeprecated": false, + "name": "vertexType", + "type": { + "kind": "ENUM", + "name": "VertexType", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The latitude of the place.", + "isDeprecated": false, + "name": "latitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The longitude of the place.", + "isDeprecated": false, + "name": "longitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The quay related to the place.", + "isDeprecated": false, + "name": "quay", + "type": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The flexible area related to the place.", + "isDeprecated": false, + "name": "flexibleArea", + "type": { + "kind": "SCALAR", + "name": "Coordinates", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The bike rental station related to the place", + "isDeprecated": false, + "name": "bikeRentalStation", + "type": { + "kind": "OBJECT", + "name": "BikeRentalStation", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The rental vehicle related to the place", + "isDeprecated": false, + "name": "rentalVehicle", + "type": { + "kind": "OBJECT", + "name": "RentalVehicle", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "Place", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": "Id is not referable or meaningful and will be removed", + "description": null, + "isDeprecated": true, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "place", + "type": { + "kind": "INTERFACE", + "name": "PlaceInterface", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "distance", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "PlaceAtDistance", + "possibleTypes": null + }, + { + "description": "Interface for places, i.e. quays, stop places, parks", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "latitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "longitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "INTERFACE", + "name": "PlaceInterface", + "possibleTypes": [ + { + "kind": "OBJECT", + "name": "BikePark", + "ofType": null + }, + { + "kind": "OBJECT", + "name": "BikeRentalStation", + "ofType": null + }, + { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + }, + { + "kind": "OBJECT", + "name": "RentalVehicle", + "ofType": null + }, + { + "kind": "OBJECT", + "name": "StopPlace", + "ofType": null + } + ] + }, + { + "description": "A list of coordinates encoded as a polyline string (see http://code.google.com/apis/maps/documentation/polylinealgorithm.html)", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "The number of points in the string", + "isDeprecated": false, + "name": "length", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The encoded points of the polyline. Be aware that the string could contain escape characters that need to be accounted for. (https://www.freeformatter.com/javascript-escape.html)", + "isDeprecated": false, + "name": "points", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "PointsOnLink", + "possibleTypes": null + }, + { + "description": "Types describing common presentation properties", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "colour", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "textColour", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "Presentation", + "possibleTypes": null + }, + { + "description": "Simple public transport situation element", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": "Use affects instead", + "description": "Get affected authority for this situation element", + "isDeprecated": true, + "name": "authority", + "type": { + "kind": "OBJECT", + "name": "Authority", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "Use affects instead", + "description": null, + "isDeprecated": true, + "name": "lines", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Line", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": "Use affects instead", + "description": null, + "isDeprecated": true, + "name": "serviceJourneys", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": "Use affects instead", + "description": null, + "isDeprecated": true, + "name": "quays", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": "Use affects instead", + "description": null, + "isDeprecated": true, + "name": "stopPlaces", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "StopPlace", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get all affected entities for the situation", + "isDeprecated": false, + "name": "affects", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "UNION", + "name": "Affects", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Summary of situation in all different translations available", + "isDeprecated": false, + "name": "summary", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MultilingualString", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Description of situation in all different translations available", + "isDeprecated": false, + "name": "description", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MultilingualString", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Advice of situation in all different translations available", + "isDeprecated": false, + "name": "advice", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MultilingualString", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Optional links to more information.", + "isDeprecated": false, + "name": "infoLinks", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "infoLink", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Period this situation is in effect", + "isDeprecated": false, + "name": "validityPeriod", + "type": { + "kind": "OBJECT", + "name": "ValidityPeriod", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "ReportType of this situation", + "isDeprecated": false, + "name": "reportType", + "type": { + "kind": "ENUM", + "name": "ReportType", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Operator's internal id for this situation", + "isDeprecated": false, + "name": "situationNumber", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Severity of this situation ", + "isDeprecated": false, + "name": "severity", + "type": { + "kind": "ENUM", + "name": "Severity", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Priority of this situation ", + "isDeprecated": false, + "name": "priority", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Timestamp for when the situation was created.", + "isDeprecated": false, + "name": "creationTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Timestamp when the situation element was updated.", + "isDeprecated": false, + "name": "versionedAtTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Codespace of the data source.", + "isDeprecated": false, + "name": "participant", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "Not yet officially supported. May be removed or renamed.", + "description": "Authority that reported this situation. Always returns the first agency in the codespace", + "isDeprecated": true, + "name": "reportAuthority", + "type": { + "kind": "OBJECT", + "name": "Authority", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "PtSituationElement", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "timeOfTravelOnly" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "dayOfTravelOnly" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "untilPreviousDay" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "advanceAndDayOfTravel" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "other" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "PurchaseWhen", + "possibleTypes": null + }, + { + "description": "A place such as platform, stance, or quayside where passengers have access to PT vehicles.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": "Fetch the name in the language given. The language should be represented as a ISO-639 language code. If the translation does not exits, the default name is returned.", + "name": "language", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "latitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "longitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The stop place to which this quay belongs to.", + "isDeprecated": false, + "name": "stopPlace", + "type": { + "kind": "OBJECT", + "name": "StopPlace", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether this quay is suitable for wheelchair boarding.", + "isDeprecated": false, + "name": "wheelchairAccessible", + "type": { + "kind": "ENUM", + "name": "WheelchairBoarding", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "timeZone", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Public code used to identify this quay within the stop place. For instance a platform code.", + "isDeprecated": false, + "name": "publicCode", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "List of lines servicing this quay", + "isDeprecated": false, + "name": "lines", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Line", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "List of journey patterns servicing this quay", + "isDeprecated": false, + "name": "journeyPatterns", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "JourneyPattern", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": "DateTime for when to fetch estimated calls from. Default value is current time", + "name": "startTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + { + "defaultValue": "86400", + "description": null, + "name": "timeRange", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": "5", + "description": "Limit the total number of departures returned.", + "name": "numberOfDepartures", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Limit the number of departures per line and destination display returned. The parameter is only applied when the value is between 1 and 'numberOfDepartures'.", + "name": "numberOfDeparturesPerLineAndDestinationDisplay", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": "departures", + "description": "Filters results by either departures, arrivals or both. For departures forBoarding has to be true and the departure time has to be within the specified time range. For arrivals, forAlight has to be true and the arrival time has to be within the specified time range. If both are asked for, either the conditions for arrivals or the conditions for departures will have to be true for an EstimatedCall to show.", + "name": "arrivalDeparture", + "type": { + "kind": "ENUM", + "name": "ArrivalDeparture", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Parameters for indicating the only authorities and/or lines or quays to list estimatedCalls for", + "name": "whiteListed", + "type": { + "kind": "INPUT_OBJECT", + "name": "InputWhiteListed", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Only show estimated calls for selected modes.", + "name": "whiteListedModes", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "TransportMode", + "ofType": null + } + } + }, + { + "defaultValue": "false", + "description": "Indicates that realtime-cancelled trips should also be included.", + "name": "includeCancelledTrips", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "List of visits to this quay as part of vehicle journeys.", + "isDeprecated": false, + "name": "estimatedCalls", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "EstimatedCall", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get all situations active for the quay.", + "isDeprecated": false, + "name": "situations", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PtSituationElement", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "stopType", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Geometry for flexible area.", + "isDeprecated": false, + "name": "flexibleArea", + "type": { + "kind": "SCALAR", + "name": "Coordinates", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "the Quays part of an flexible group.", + "isDeprecated": false, + "name": "flexibleGroup", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "tariffZones", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "TariffZone", + "ofType": null + } + } + } + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "PlaceInterface", + "ofType": null + } + ], + "kind": "OBJECT", + "name": "Quay", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "quay", + "type": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The distance in meters to the given quay.", + "isDeprecated": false, + "name": "distance", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "QuayAtDistance", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [ + { + "defaultValue": null, + "description": "Date and time for the earliest time the user is willing to start the journey (if arriveBy=false/not set) or the latest acceptable time of arriving (arriveBy=true). Defaults to now", + "name": "dateTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "The length of the search-window in minutes. This parameter is optional.\n\nThe search-window is defined as the duration between the earliest-departure-time(EDT) and the latest-departure-time(LDT). OTP will search for all itineraries in this departure window. If `arriveBy=true` the `dateTime` parameter is the latest-arrival-time, so OTP will dynamically calculate the EDT. Using a short search-window is faster than using a longer one, but the search duration is not linear. Using a \"too\" short search-window will waste resources server side, while using a search-window that is too long will be slow.\n\nOTP will dynamically calculate a reasonable value for the search-window, if not provided. The calculation comes with a significant overhead (10-20% extra). Whether you should use the dynamic calculated value or pass in a value depends on your use-case. For a travel planner in a small geographical area, with a dense network of public transportation, a fixed value between 40 minutes and 2 hours makes sense. To find the appropriate search-window, adjust it so that the number of itineraries on average is around the wanted `numItineraries`. Make sure you set the `numItineraries` to a high number while testing. For a country wide area like Norway, using the dynamic search-window is the best.\n\nWhen paginating, the search-window is calculated using the `numItineraries` in the original search together with statistics from the search for the last page. This behaviour is configured server side, and can not be overridden from the client.\n\nThe search-window used is returned to the response metadata as `searchWindowUsed` for debugging purposes.", + "name": "searchWindow", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Use the cursor to go to the next \"page\" of itineraries. Copy the cursor from the last response and keep the original request as is. This will enable you to search for itineraries in the next or previous time-window.", + "name": "pageCursor", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Search for the best trip options within a time window. If `true` two TripPatterns are considered optimal if one is better on arrival time(earliest wins) and the other is better on departure time(latest wins).In combination with `arriveBy` this parameter cover the following 3 use cases:\n\n\n - Traveler want to find the best alternative within a time window. Set `timetableView=true` and `arriveBy=false`. This is the default, and if the intention of the traveler is unknown it gives the best result, because it includes the two next use-cases. This option also work well with paging. Setting the `arriveBy=true`, covers the same use-case, but the input time is interpreted as latest-arrival-time, and not earliest-departure-time.\n\n - Traveler want to find the best alternative with departure after a specific time. For example: I am at the station now and want to get home as quickly as possible. Set `timetableView=false` and `arriveBy=false`. Do not support paging.\n\n - Traveler want to find the best alternative with arrival before a specific time. For example going to a meeting. Set `timetableView=false` and `arriveBy=true`. Do not support paging.\n\nDefault: `true`", + "name": "timetableView", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "The start location", + "name": "from", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "Location", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "The destination location", + "name": "to", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "Location", + "ofType": null + } + } + }, + { + "defaultValue": "false", + "description": "Whether the trip should depart at dateTime (false, the default), or arrive at dateTime. See `timetableView` for use-cases where this parameter is relevant.", + "name": "arriveBy", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "defaultValue": "false", + "description": "Whether the trip must be wheelchair accessible. Supported for the street part to the search, not implemented for the transit yet.", + "name": "wheelchairAccessible", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "defaultValue": "false", + "description": "When true, realtime updates are ignored during this search.", + "name": "ignoreRealtimeUpdates", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "defaultValue": "false", + "description": "When true, service journeys cancelled in scheduled route data will be included during this search.", + "name": "includePlannedCancellations", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "defaultValue": "false", + "description": "When true, service journeys cancelled by real-time updates will be included during this search.", + "name": "includeRealtimeCancellations", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "defaultValue": "no", + "description": "The preferable language to use for text targeted the end user. Note! The data quality is limited, only stop and quay names are translates, and not in all places of the API.", + "name": "locale", + "type": { + "kind": "ENUM", + "name": "Locale", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "The set of access/egress/direct/transit modes to be used for this search. Note that this only works at the Line level. If individual ServiceJourneys have modes that differ from the Line mode, this will NOT be accounted for.", + "name": "modes", + "type": { + "kind": "INPUT_OBJECT", + "name": "Modes", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Parameters for indicating authorities, lines or quays not be used in the trip patterns", + "name": "banned", + "type": { + "kind": "INPUT_OBJECT", + "name": "InputBanned", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Parameters for indicating the only authorities, lines or quays to be used in the trip patterns", + "name": "whiteListed", + "type": { + "kind": "INPUT_OBJECT", + "name": "InputWhiteListed", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "A list of filters for which trips should be included. A trip will be included if it matches with at least one filter. An empty list of filters means that all trips should be included. If a search include this parameter, \"whiteListed\", \"banned\" & \"modes.transportModes\" filters will be ignored.", + "name": "filters", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "TripFilterInput", + "ofType": null + } + } + } + }, + { + "defaultValue": "1.3", + "description": "The maximum walk speed along streets, in meters per second.", + "name": "walkSpeed", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "defaultValue": "4.0", + "description": "Walk cost is multiplied by this value. This is the main parameter to use for limiting walking.", + "name": "walkReluctance", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "defaultValue": "1.0", + "description": "Wait cost is multiplied by this value. Setting this to a value lower than 1 indicates that waiting is better than staying on a vehicle. This should never be set higher than walkReluctance, since that would lead to walking down a line to avoid waiting.", + "name": "waitReluctance", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "defaultValue": "5.0", + "description": "The maximum bike speed along streets, in meters per second", + "name": "bikeSpeed", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "defaultValue": "safe", + "description": "The set of characteristics that the user wants to optimise for during bicycle searches -- defaults to safe", + "name": "bicycleOptimisationMethod", + "type": { + "kind": "ENUM", + "name": "BicycleOptimisationMethod", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "When setting the BicycleOptimisationMethod to 'triangle', use these values to tell the routing engine how important each of the factors is compared to the others. All values should add up to 1.", + "name": "triangleFactors", + "type": { + "kind": "INPUT_OBJECT", + "name": "TriangleFactors", + "ofType": null + } + }, + { + "defaultValue": "false", + "description": "Whether or not bike rental availability information will be used to plan bike rental trips.", + "name": "useBikeRentalAvailabilityInformation", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "defaultValue": "0", + "description": "An extra penalty added on transfers (i.e. all boardings except the first one). The transferPenalty is used when a user requests even less transfers. In the latter case, we don't actually optimise for fewest transfers, as this can lead to absurd results. Consider a trip in New York from Grand Army Plaza (the one in Brooklyn) to Kalustyan's at noon. The true lowest transfers trip pattern is to wait until midnight, when the 4 train runs local the whole way. The actual fastest trip pattern is the 2/3 to the 4/5 at Nevins to the 6 at Union Square, which takes half an hour. Even someone optimise for fewest transfers doesn't want to wait until midnight. Maybe they would be willing to walk to 7th Ave and take the Q to Union Square, then transfer to the 6. If this takes less than transferPenalty seconds, then that's what we'll return.", + "name": "transferPenalty", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": "120", + "description": "An expected transfer time (in seconds) that specifies the amount of time that must pass between exiting one public transport vehicle and boarding another. This time is in addition to time it might take to walk between stops.", + "name": "transferSlack", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": "0", + "description": "The boardSlack is the minimum extra time to board a public transport vehicle. This is the same as the 'minimumTransferTime', except that this also apply to to the first transit leg in the trip. This is the default value used, if not overridden by the 'boardSlackList'.", + "name": "boardSlackDefault", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "List of boardSlack for a given set of modes. Defaults: [air : PT35M]", + "name": "boardSlackList", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "TransportModeSlack", + "ofType": null + } + } + }, + { + "defaultValue": "0", + "description": "The alightSlack is the minimum extra time after exiting a public transport vehicle. This is the default value used, if not overridden by the 'alightSlackList'.", + "name": "alightSlackDefault", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "List of alightSlack for a given set of modes. Defaults: [air : PT15M]", + "name": "alightSlackList", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "TransportModeSlack", + "ofType": null + } + } + }, + { + "defaultValue": "12", + "description": "The maximum number of trip patterns to return. Note! This reduce the number of trip patterns AFTER the OTP travel search is done in a post-filtering process. There is little/no performance gain in reducing the number of trip patterns returned. See also the trip meta-data on how to implement paging.", + "name": "numTripPatterns", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": "12", + "description": "Maximum number of transfers. Note! The best way to reduce the number of transfers is to set the `transferPenalty` parameter.", + "name": "maximumTransfers", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": "5", + "description": "Maximum number of additional transfers compared to the best number of transfers allowed. Note! The best way to reduce the number of transfers is to set the `transferPenalty` parameter.", + "name": "maximumAdditionalTransfers", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": "false", + "description": "Debug the itinerary-filter-chain. OTP will attach a system notice to itineraries instead of removing them. This is very convenient when tuning the filters.", + "name": "debugItineraryFilter", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "defaultValue": "null", + "description": "Whether non-optimal transit paths at the destination should be returned. Let c be the\nexisting minimum pareto optimal generalized-cost to beat. Then a trip with cost c' is\naccepted if the following is true:\n\n`c' < Math.round(c * relaxTransitSearchGeneralizedCostAtDestination)`\n\nThe parameter is optional. If not set, a normal comparison is performed.\n\nValues less than 1.0 is not allowed, and values greater than 2.0 are not\nsupported, due to performance reasons.\n", + "name": "relaxTransitSearchGeneralizedCostAtDestination", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Configure the itinerary-filter-chain. NOTE! THESE PARAMETERS ARE USED FOR SERVER-SIDE TUNING AND IS AVAILABLE HERE FOR TESTING ONLY.", + "name": "itineraryFilters", + "type": { + "kind": "INPUT_OBJECT", + "name": "ItineraryFilters", + "ofType": null + } + }, + { + "defaultValue": "[{streetMode : bike_rental, duration : \"PT20M\"}]", + "description": "Maximum duration for access/egress for street searches per respective mode. Cannot be higher than default value. This is a performance optimisation parameter, avoid using it to limit the search. ", + "name": "maxAccessEgressDurationForMode", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "StreetModeDurationInput", + "ofType": null + } + } + } + }, + { + "defaultValue": "[{streetMode : car, duration : \"PT12H\"}]", + "description": "Maximum duration for direct street searchers per respective mode. Cannot be higher than default value. This is a performance optimisation parameter, avoid using it to limit the search.", + "name": "maxDirectDurationForMode", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "StreetModeDurationInput", + "ofType": null + } + } + } + }, + { + "defaultValue": null, + "description": "FOR TESTING ONLY", + "name": "extraSearchCoachReluctance", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Input type for executing a travel search for a trip between two locations. Returns trip patterns describing suggested alternatives for the trip.", + "isDeprecated": false, + "name": "trip", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Trip", + "ofType": null + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": "Date and time for the earliest time the user is willing to start the journey (if arriveBy=false/not set) or the latest acceptable time of arriving (arriveBy=true). Defaults to now", + "name": "dateTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "The length of the search-window. This parameter is optional.\n\nThe search-window is defined as the duration between the earliest-departure-time(EDT) and the latest-departure-time(LDT). OTP will search for all itineraries in this departure window. If `arriveBy=true` the `dateTime` parameter is the latest-arrival-time, so OTP will dynamically calculate the EDT. Using a short search-window is faster than using a longer one, but the search duration is not linear. Using a \"too\" short search-window will waste resources server side, while using a search-window that is too long will be slow.\n\nOTP will dynamically calculate a reasonable value for the search-window, if not provided. The calculation comes with a significant overhead (10-20% extra). Whether you should use the dynamic calculated value or pass in a value depends on your use-case. For a travel planner in a small geographical area, with a dense network of public transportation, a fixed value between 40 minutes and 2 hours makes sense. To find the appropriate search-window, adjust it so that the number of itineraries on average is around the wanted `numItineraries`. Make sure you set the `numItineraries` to a high number while testing. For a country wide area like Norway, using the dynamic search-window is the best.\n\nWhen paginating, the search-window is calculated using the `numItineraries` in the original search together with statistics from the search for the last page. This behaviour is configured server side, and can not be overridden from the client.\n\nThe search-window used is returned to the response metadata as `searchWindowUsed` for debugging purposes.", + "name": "searchWindow", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Duration", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Use the cursor to go to the next \"page\" of itineraries. Copy the cursor from the last response and keep the original request as is. This will enable you to search for itineraries in the next or previous time-window.", + "name": "pageCursor", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "The start location", + "name": "from", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "Location", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "The destination location", + "name": "to", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "Location", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "The locations needed to be visited along the route.", + "name": "via", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "ViaLocationInput", + "ofType": null + } + } + } + } + }, + { + "defaultValue": null, + "description": "The requests for the individual segments of the search. The first segment is from the start location(`from`) to the first entry in the `via` locations list and the last is from the last entry in the `via` locations list to the end location(`to`). Note that the list must have length of exactly one greater than the `via` field.", + "name": "segments", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "ViaSegmentInput", + "ofType": null + } + } + } + }, + { + "defaultValue": "12", + "description": "The maximum number of trip patterns segment to return. Note! This reduces the number of trip patterns AFTER the OTP travel search is done in a post-filtering process. There is little/no performance gain in reducing the number of trip patterns returned. See also the trip meta-data on how to implement paging.", + "name": "numTripPatterns", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": "false", + "description": "Whether the trip must be wheelchair accessible. Supported for the street part to the search, not implemented for the transit yet.", + "name": "wheelchairAccessible", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "defaultValue": "no", + "description": "The preferable language to use for text targeted the end user. Note! The data quality is limited, only stop and quay names are translates, and not in all places of the API.", + "name": "locale", + "type": { + "kind": "ENUM", + "name": "Locale", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Via trip search. Find trip patterns traveling via one or more intermediate (via) locations.", + "isDeprecated": false, + "name": "viaTrip", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ViaTrip", + "ofType": null + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get a single stopPlace based on its id)", + "isDeprecated": false, + "name": "stopPlace", + "type": { + "kind": "OBJECT", + "name": "StopPlace", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "ids", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get all stopPlaces", + "isDeprecated": false, + "name": "stopPlaces", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "StopPlace", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "minimumLatitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "minimumLongitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "maximumLatitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "maximumLongitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "authority", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": "parent", + "description": "MultiModalMode for query. To control whether multi modal parent stop places, their mono modal children or both are included in the response. Does not affect mono modal stop places that do not belong to a multi modal stop place.", + "name": "multiModalMode", + "type": { + "kind": "ENUM", + "name": "MultiModalMode", + "ofType": null + } + }, + { + "defaultValue": "false", + "description": "If true only stop places with at least one visiting line are included.", + "name": "filterByInUse", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Get all stop places within the specified bounding box", + "isDeprecated": false, + "name": "stopPlacesByBbox", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "StopPlace", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get a single quay based on its id)", + "isDeprecated": false, + "name": "quay", + "type": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "ids", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "name", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Get all quays", + "isDeprecated": false, + "name": "quays", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "minimumLatitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "minimumLongitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "maximumLatitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "maximumLongitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "authority", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": "false", + "description": "If true only quays with at least one visiting line are included.", + "name": "filterByInUse", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Get all quays within the specified bounding box", + "isDeprecated": false, + "name": "quaysByBbox", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": "Latitude of the location", + "name": "latitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Longitude of the location", + "name": "longitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Radius via streets (in meters) to search for from the specified location", + "name": "radius", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "authority", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "fetching only nodes before this node (exclusive)", + "name": "before", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "fetching only nodes after this node (exclusive)", + "name": "after", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "fetching only the first certain number of nodes", + "name": "first", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "fetching only the last certain number of nodes", + "name": "last", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Get all quays within the specified walking radius from a location. There are no maximum limits for the input parameters, but the query will timeout and return if the parameters are too high.", + "isDeprecated": false, + "name": "quaysByRadius", + "type": { + "kind": "OBJECT", + "name": "quayAtDistanceConnection", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": null, + "description": "Latitude of the location", + "name": "latitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Longitude of the location", + "name": "longitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": "2000.0", + "description": "Maximum distance (in meters) to search for from the specified location. Default is 2000m.", + "name": "maximumDistance", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": "20", + "description": "Maximum number of results. Search is stopped when this limit is reached. Default is 20.", + "name": "maximumResults", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": "[quay, stopPlace, bicycleRent, bikePark, carPark]", + "description": "Only include places of given types if set. Default accepts all types", + "name": "filterByPlaceTypes", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "FilterPlaceType", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Only include places that include this mode. Only checked for places with mode i.e. quays, departures.", + "name": "filterByModes", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "TransportMode", + "ofType": null + } + } + }, + { + "defaultValue": "false", + "description": "Only affects queries for quays and stop places. If true only quays and stop places with at least one visiting line are included.", + "name": "filterByInUse", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Only include places that match one of the given ids.", + "name": "filterByIds", + "type": { + "kind": "INPUT_OBJECT", + "name": "InputPlaceIds", + "ofType": null + } + }, + { + "defaultValue": "parent", + "description": "MultiModalMode for query. To control whether multi modal parent stop places, their mono modal children or both are included in the response. Does not affect mono modal stop places that do not belong to a multi modal stop place. Only applicable for placeType StopPlace", + "name": "multiModalMode", + "type": { + "kind": "ENUM", + "name": "MultiModalMode", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "fetching only nodes before this node (exclusive)", + "name": "before", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "fetching only nodes after this node (exclusive)", + "name": "after", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "fetching only the first certain number of nodes", + "name": "first", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "fetching only the last certain number of nodes", + "name": "last", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Get all places (quays, stop places, car parks etc. with coordinates) within the specified radius from a location. The returned type has two fields place and distance. The search is done by walking so the distance is according to the network of walkables.", + "isDeprecated": false, + "name": "nearest", + "type": { + "kind": "OBJECT", + "name": "placeAtDistanceConnection", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get an authority by ID", + "isDeprecated": false, + "name": "authority", + "type": { + "kind": "OBJECT", + "name": "Authority", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get all authorities", + "isDeprecated": false, + "name": "authorities", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Authority", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get a operator by ID", + "isDeprecated": false, + "name": "operator", + "type": { + "kind": "OBJECT", + "name": "Operator", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get all operators", + "isDeprecated": false, + "name": "operators", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Operator", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get a single line based on its id", + "isDeprecated": false, + "name": "line", + "type": { + "kind": "OBJECT", + "name": "Line", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "ids", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "name", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "publicCode", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "publicCodes", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "transportModes", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "TransportMode", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Set of ids of authorities to fetch lines for.", + "name": "authorities", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "defaultValue": "false", + "description": "Filter by lines containing flexible / on demand serviceJourneys only.", + "name": "flexibleOnly", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Get all lines", + "isDeprecated": false, + "name": "lines", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Line", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get a single group of lines based on its id", + "isDeprecated": false, + "name": "groupOfLines", + "type": { + "kind": "OBJECT", + "name": "GroupOfLines", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get all groups of lines", + "isDeprecated": false, + "name": "groupsOfLines", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "GroupOfLines", + "ofType": null + } + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get a single service journey based on its id", + "isDeprecated": false, + "name": "serviceJourney", + "type": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": null, + "description": "Set of ids of lines to fetch serviceJourneys for.", + "name": "lines", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Set of ids of private codes to fetch serviceJourneys for.", + "name": "privateCodes", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Set of ids of active dates to fetch serviceJourneys for.", + "name": "activeDates", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Set of ids of authorities to fetch serviceJourneys for.", + "name": "authorities", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get all service journeys", + "isDeprecated": false, + "name": "serviceJourneys", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "ids", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get all bike rental stations", + "isDeprecated": false, + "name": "bikeRentalStations", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "BikeRentalStation", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get all bike rental stations", + "isDeprecated": false, + "name": "bikeRentalStation", + "type": { + "kind": "OBJECT", + "name": "BikeRentalStation", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "minimumLatitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "minimumLongitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "maximumLatitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "defaultValue": null, + "description": null, + "name": "maximumLongitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Get all bike rental stations within the specified bounding box.", + "isDeprecated": false, + "name": "bikeRentalStationsByBbox", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "BikeRentalStation", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get a single bike park based on its id", + "isDeprecated": false, + "name": "bikePark", + "type": { + "kind": "OBJECT", + "name": "BikePark", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get all bike parks", + "isDeprecated": false, + "name": "bikeParks", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "BikePark", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get default routing parameters.", + "isDeprecated": false, + "name": "routingParameters", + "type": { + "kind": "OBJECT", + "name": "RoutingParameters", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": null, + "description": "Filter by reporting source.", + "name": "codespaces", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Filter by severity.", + "name": "severities", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "Severity", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get all active situations.", + "isDeprecated": false, + "name": "situations", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PtSituationElement", + "ofType": null + } + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "situationNumber", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Get a single situation based on its situationNumber", + "isDeprecated": false, + "name": "situation", + "type": { + "kind": "OBJECT", + "name": "PtSituationElement", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + } + ], + "deprecationReason": null, + "description": "Refetch a single leg based on its id", + "isDeprecated": false, + "name": "leg", + "type": { + "kind": "OBJECT", + "name": "Leg", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get OTP server information", + "isDeprecated": false, + "name": "serverInfo", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ServerInfo", + "ofType": null + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Get a single dated service journey based on its id", + "isDeprecated": false, + "name": "datedServiceJourney", + "type": { + "kind": "OBJECT", + "name": "DatedServiceJourney", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "lines", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "serviceJourneys", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "privateCodes", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "operatingDays", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + } + } + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "alterations", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "ServiceAlteration", + "ofType": null + } + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "authorities", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + }, + { + "defaultValue": null, + "description": "Get all DatedServiceJourneys, which are replacing any of the given DatedServiceJourneys ids", + "name": "replacementFor", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + } + ], + "deprecationReason": null, + "description": "Get all dated service journeys, matching the filters", + "isDeprecated": false, + "name": "datedServiceJourneys", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "DatedServiceJourney", + "ofType": null + } + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "QueryType", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": "The service journey information comes from the regular time table, i.e. no real-time update has been applied.", + "isDeprecated": false, + "name": "scheduled" + }, + { + "deprecationReason": null, + "description": "The service journey information has been updated, but the journey pattern stayed the same as the journey pattern of the scheduled service journey.", + "isDeprecated": false, + "name": "updated" + }, + { + "deprecationReason": null, + "description": "The service journey has been canceled by a real-time update.", + "isDeprecated": false, + "name": "canceled" + }, + { + "deprecationReason": null, + "description": "The service journey has been added using a real-time update, i.e. the service journey was not present in the regular time table.", + "isDeprecated": false, + "name": "Added" + }, + { + "deprecationReason": null, + "description": "The service journey information has been updated and resulted in a different journey pattern compared to the journey pattern of the scheduled service journey.", + "isDeprecated": false, + "name": "modified" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "RealtimeState", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "depart" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "hardLeft" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "left" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "slightlyLeft" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "continue" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "slightlyRight" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "right" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "hardRight" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "circleClockwise" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "circleCounterclockwise" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "elevator" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "uturnLeft" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "uturnRight" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "RelativeDirection", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "vehicleType", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "RentalVehicleType", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "network", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "longitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "latitude", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "currentRangeMeters", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "PlaceInterface", + "ofType": null + } + ], + "kind": "OBJECT", + "name": "RentalVehicle", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "vehicleTypeId", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "formFactor", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "propulsionType", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "maxRangeMeters", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "RentalVehicleType", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": "Indicates a general info-message that should not affect trip.", + "isDeprecated": false, + "name": "general" + }, + { + "deprecationReason": null, + "description": "Indicates an incident that may affect trip.", + "isDeprecated": false, + "name": "incident" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "ReportType", + "possibleTypes": null + }, + { + "description": "Description of the reason, why the planner did not return any results", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "An enum describing the reason", + "isDeprecated": false, + "name": "code", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "RoutingErrorCode", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "An enum describing the field which should be changed, in order for the search to succeed", + "isDeprecated": false, + "name": "inputField", + "type": { + "kind": "ENUM", + "name": "InputField", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "A textual description of why the search failed. The clients are expected to have their own translations based on the code, for user visible error messages.", + "isDeprecated": false, + "name": "description", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "RoutingError", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": "The specified location is not close to any streets or transit stops", + "isDeprecated": false, + "name": "locationNotFound" + }, + { + "deprecationReason": null, + "description": "No stops are reachable from the location specified. You can try searching using a different access or egress mode", + "isDeprecated": false, + "name": "noStopsInRange" + }, + { + "deprecationReason": null, + "description": "No transit connection was found between the origin and destination withing the operating day or the next day", + "isDeprecated": false, + "name": "noTransitConnection" + }, + { + "deprecationReason": null, + "description": "Transit connection was found, but it was outside the search window, see metadata for the next search window", + "isDeprecated": false, + "name": "noTransitConnectionInSearchWindow" + }, + { + "deprecationReason": null, + "description": "The coordinates are outside the bounds of the data currently loaded into the system", + "isDeprecated": false, + "name": "outsideBounds" + }, + { + "deprecationReason": null, + "description": "The date specified is outside the range of data currently loaded into the system", + "isDeprecated": false, + "name": "outsideServicePeriod" + }, + { + "deprecationReason": null, + "description": "The origin and destination are so close to each other, that walking is always better, but no direct mode was specified for the search", + "isDeprecated": false, + "name": "walkingBetterThanTransit" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "RoutingErrorCode", + "possibleTypes": null + }, + { + "description": "The default parameters used in travel searches.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "Max walk speed along streets, in meters per second", + "isDeprecated": false, + "name": "walkSpeed", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Max bike speed along streets, in meters per second", + "isDeprecated": false, + "name": "bikeSpeed", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Max car speed along streets, in meters per second", + "isDeprecated": false, + "name": "carSpeed", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "This is the maximum duration in seconds for a direct street search. This is a performance limit and should therefore be set high. Use filters to limit what is presented to the client.", + "isDeprecated": false, + "name": "maxDirectStreetDuration", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether the trip must be wheelchair accessible.", + "isDeprecated": false, + "name": "wheelChairAccessible", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The maximum number of itineraries to return.", + "isDeprecated": false, + "name": "numItineraries", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The maximum slope of streets for wheelchair trips.", + "isDeprecated": false, + "name": "maxSlope", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "This parameter is always enabled", + "description": "Whether the planner should return intermediate stops lists for transit legs.", + "isDeprecated": true, + "name": "showIntermediateStops", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "An extra penalty added on transfers (i.e. all boardings except the first one).", + "isDeprecated": false, + "name": "transferPenalty", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "A multiplier for how bad walking is, compared to being in transit for equal lengths of time.", + "isDeprecated": false, + "name": "walkReluctance", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Used instead of walkReluctance for stairs.", + "isDeprecated": false, + "name": "stairsReluctance", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Multiplicative factor on expected turning time.", + "isDeprecated": false, + "name": "turnReluctance", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "How long does it take to get on an elevator, on average.", + "isDeprecated": false, + "name": "elevatorBoardTime", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "What is the cost of boarding a elevator?", + "isDeprecated": false, + "name": "elevatorBoardCost", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "How long does it take to advance one floor on an elevator?", + "isDeprecated": false, + "name": "elevatorHopTime", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "What is the cost of travelling one floor on an elevator?", + "isDeprecated": false, + "name": "elevatorHopCost", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Time to rent a bike.", + "isDeprecated": false, + "name": "bikeRentalPickupTime", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Cost to rent a bike.", + "isDeprecated": false, + "name": "bikeRentalPickupCost", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Time to drop-off a rented bike.", + "isDeprecated": false, + "name": "bikeRentalDropOffTime", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Cost to drop-off a rented bike.", + "isDeprecated": false, + "name": "bikeRentalDropOffCost", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Time to park a bike.", + "isDeprecated": false, + "name": "bikeParkTime", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Cost to park a bike.", + "isDeprecated": false, + "name": "bikeParkCost", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Time to park a car in a park and ride, w/o taking into account driving and walking cost.", + "isDeprecated": false, + "name": "carDropOffTime", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "How much worse is waiting for a transit vehicle than being on a transit vehicle, as a multiplier.", + "isDeprecated": false, + "name": "waitReluctance", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "This prevents unnecessary transfers by adding a cost for boarding a vehicle.", + "isDeprecated": false, + "name": "walkBoardCost", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Separate cost for boarding a vehicle with a bicycle, which is more difficult than on foot.", + "isDeprecated": false, + "name": "bikeBoardCost", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Penalty added for using every route that is not preferred if user set any route as preferred. We return number of seconds that we are willing to wait for preferred route.", + "isDeprecated": false, + "name": "otherThanPreferredRoutesPenalty", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "A global minimum transfer time (in seconds) that specifies the minimum amount of time that must pass between exiting one transit vehicle and boarding another.", + "isDeprecated": false, + "name": "transferSlack", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The boardSlack is the minimum extra time to board a public transport vehicle. This is the same as the 'minimumTransferTime', except that this also apply to to the first transit leg in the trip. This is the default value used, if not overridden by the 'boardSlackList'.", + "isDeprecated": false, + "name": "boardSlackDefault", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "List of boardSlack for a given set of modes.", + "isDeprecated": false, + "name": "boardSlackList", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "TransportModeSlackType", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The alightSlack is the minimum extra time after exiting a public transport vehicle. This is the default value used, if not overridden by the 'alightSlackList'.", + "isDeprecated": false, + "name": "alightSlackDefault", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "List of alightSlack for a given set of modes.", + "isDeprecated": false, + "name": "alightSlackList", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "TransportModeSlackType", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Maximum number of transfers returned in a trip plan.", + "isDeprecated": false, + "name": "maxTransfers", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Maximum number of transfers allowed in addition to the result with least number of transfers", + "isDeprecated": false, + "name": "maxAdditionalTransfers", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "NOT IN USE IN OTP2.", + "description": null, + "isDeprecated": true, + "name": "reverseOptimizeOnTheFly", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "NOT IN USE IN OTP2.", + "description": null, + "isDeprecated": true, + "name": "compactLegsByReversedSearch", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The deceleration speed of an automobile, in meters per second per second.", + "isDeprecated": false, + "name": "carDecelerationSpeed", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The acceleration speed of an automobile, in meters per second per second.", + "isDeprecated": false, + "name": "carAccelerationSpeed", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "When true, realtime updates are ignored during this search.", + "isDeprecated": false, + "name": "ignoreRealTimeUpdates", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "When true, service journeys cancelled in scheduled route data will be included during this search.", + "isDeprecated": false, + "name": "includedPlannedCancellations", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "If true, the remaining weight heuristic is disabled.", + "isDeprecated": false, + "name": "disableRemainingWeightHeuristic", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "Rental is specified by modes", + "description": "", + "isDeprecated": true, + "name": "allowBikeRental", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "Parking is specified by modes", + "description": null, + "isDeprecated": true, + "name": "parkAndRide", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "Parking is specified by modes", + "description": null, + "isDeprecated": true, + "name": "kissAndRide", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "Use `itineraryFilter.debug` instead.", + "description": null, + "isDeprecated": true, + "name": "debugItineraryFilter", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "This is replaced by modes input object", + "description": "Accept only paths that use transit (no street-only paths).", + "isDeprecated": true, + "name": "onlyTransitTrips", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "This is not supported!", + "description": "Option to disable the default filtering of GTFS-RT alerts by time.", + "isDeprecated": true, + "name": "disableAlertFiltering", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether to apply the ellipsoid->geoid offset to all elevations in the response.", + "isDeprecated": false, + "name": "geoIdElevation", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "RoutingParameters", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "Maven version", + "isDeprecated": false, + "name": "version", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "OTP Build timestamp", + "isDeprecated": false, + "name": "buildTime", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "", + "isDeprecated": false, + "name": "gitBranch", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "", + "isDeprecated": false, + "name": "gitCommit", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "", + "isDeprecated": false, + "name": "gitCommitTime", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The 'configVersion' of the otp-config.json file.", + "isDeprecated": false, + "name": "otpConfigVersion", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The 'configVersion' of the build-config.json file.", + "isDeprecated": false, + "name": "buildConfigVersion", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The 'configVersion' of the router-config.json file.", + "isDeprecated": false, + "name": "routerConfigVersion", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The otp-serialization-version-id used to check graphs for compatibility with current version of OTP.", + "isDeprecated": false, + "name": "otpSerializationVersionId", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "ServerInfo", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "cancellation" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "replaced" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "extraJourney" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "planned" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "ServiceAlteration", + "possibleTypes": null + }, + { + "description": "A planned vehicle journey with passengers.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "line", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Line", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "activeDates", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "transportMode", + "type": { + "kind": "ENUM", + "name": "TransportMode", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "transportSubmode", + "type": { + "kind": "ENUM", + "name": "TransportSubmode", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Publicly announced code for service journey, differentiating it from other service journeys for the same line.", + "isDeprecated": false, + "name": "publicCode", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "For internal use by operators.", + "isDeprecated": false, + "name": "privateCode", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "operator", + "type": { + "kind": "OBJECT", + "name": "Operator", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "directionType", + "type": { + "kind": "ENUM", + "name": "DirectionType", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "The service journey alteration will be moved out of SJ and grouped together with the SJ and date. In Netex this new type is called DatedServiceJourney. We will create artificial DSJs for the old SJs.", + "description": null, + "isDeprecated": true, + "name": "serviceAlteration", + "type": { + "kind": "ENUM", + "name": "ServiceAlteration", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether service journey is accessible with wheelchair.", + "isDeprecated": false, + "name": "wheelchairAccessible", + "type": { + "kind": "ENUM", + "name": "WheelchairBoarding", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether bikes are allowed on service journey.", + "isDeprecated": false, + "name": "bikesAllowed", + "type": { + "kind": "ENUM", + "name": "BikesAllowed", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "JourneyPattern for the service journey, according to scheduled data. If the ServiceJourney is not included in the scheduled data, null is returned.", + "isDeprecated": false, + "name": "journeyPattern", + "type": { + "kind": "OBJECT", + "name": "JourneyPattern", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": null, + "description": "Only fetch the first n quays on the service journey", + "name": "first", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Only fetch the last n quays on the service journey", + "name": "last", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Quays visited by service journey, according to scheduled data. If the ServiceJourney is not included in the scheduled data, an empty list is returned.", + "isDeprecated": false, + "name": "quays", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Returns scheduled passing times only - without realtime-updates, for realtime-data use 'estimatedCalls'", + "isDeprecated": false, + "name": "passingTimes", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "TimetabledPassingTime", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": "Date to get estimated calls for. Defaults to today.", + "name": "date", + "type": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Returns scheduled passingTimes for this ServiceJourney for a given date, updated with realtime-updates (if available). NB! This takes a date as argument (default=today) and returns estimatedCalls for that date and should only be used if the date is known when creating the request. For fetching estimatedCalls for a given trip.leg, use leg.serviceJourneyEstimatedCalls instead.", + "isDeprecated": false, + "name": "estimatedCalls", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "EstimatedCall", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Detailed path travelled by service journey. Not available for flexible trips.", + "isDeprecated": false, + "name": "pointsOnLink", + "type": { + "kind": "OBJECT", + "name": "PointsOnLink", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "notices", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Notice", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get all situations active for the service journey.", + "isDeprecated": false, + "name": "situations", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PtSituationElement", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": "BookingArrangements are defined per stop, and can be found under `passingTimes` or `estimatedCalls`", + "description": "Booking arrangements for flexible services.", + "isDeprecated": true, + "name": "bookingArrangements", + "type": { + "kind": "OBJECT", + "name": "BookingArrangement", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "ServiceJourney", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": "Situation has unknown impact on trips.", + "isDeprecated": false, + "name": "unknown" + }, + { + "deprecationReason": null, + "description": "Situation has no impact on trips.", + "isDeprecated": false, + "name": "noImpact" + }, + { + "deprecationReason": null, + "description": "Situation has a very slight impact on trips.", + "isDeprecated": false, + "name": "verySlight" + }, + { + "deprecationReason": null, + "description": "Situation has a slight impact on trips.", + "isDeprecated": false, + "name": "slight" + }, + { + "deprecationReason": null, + "description": "Situation has an impact on trips (default).", + "isDeprecated": false, + "name": "normal" + }, + { + "deprecationReason": null, + "description": "Situation has a severe impact on trips.", + "isDeprecated": false, + "name": "severe" + }, + { + "deprecationReason": null, + "description": "Situation has a very severe impact on trips.", + "isDeprecated": false, + "name": "verySevere" + }, + { + "deprecationReason": null, + "description": "Severity is undefined.", + "isDeprecated": false, + "name": "undefined" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "Severity", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": "Situation applies when stop is the destination of the leg.", + "isDeprecated": false, + "name": "destination" + }, + { + "deprecationReason": null, + "description": "Situation applies when stop is the startpoint of the leg.", + "isDeprecated": false, + "name": "startPoint" + }, + { + "deprecationReason": null, + "description": "Situation applies when transfering to another leg at the stop.", + "isDeprecated": false, + "name": "exceptionalStop" + }, + { + "deprecationReason": null, + "description": "Situation applies when passing the stop, without stopping.", + "isDeprecated": false, + "name": "notStopping" + }, + { + "deprecationReason": null, + "description": "Situation applies when at the stop, and the stop requires a request to stop.", + "isDeprecated": false, + "name": "requestStop" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "StopCondition", + "possibleTypes": null + }, + { + "description": "Named place where public transport may be accessed. May be a building complex (e.g. a station) or an on-street location.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": "Fetch the name in the language given. The language should be represented as a ISO-639 language code. If the translation does not exist, the default name is returned.", + "name": "language", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "latitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "longitude", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Relative weighting of this stop with regards to interchanges. NOT IMPLEMENTED", + "isDeprecated": false, + "name": "weighting", + "type": { + "kind": "ENUM", + "name": "InterchangeWeighting", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "tariffZones", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "TariffZone", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The transport modes of quays under this stop place.", + "isDeprecated": false, + "name": "transportMode", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "TransportMode", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The transport submode serviced by this stop place.", + "isDeprecated": false, + "name": "transportSubmode", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "TransportSubmode", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "timeZone", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": "false", + "description": "If true only quays with at least one visiting line are included.", + "name": "filterByInUse", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "Returns all quays that are children of this stop place", + "isDeprecated": false, + "name": "quays", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Returns parent stop for this stop", + "isDeprecated": false, + "name": "parent", + "type": { + "kind": "OBJECT", + "name": "StopPlace", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": null, + "description": "DateTime for when to fetch estimated calls from. Default value is current time", + "name": "startTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + { + "defaultValue": "86400", + "description": null, + "name": "timeRange", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": "5", + "description": "Limit the total number of departures returned.", + "name": "numberOfDepartures", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Limit the number of departures per line and destination display returned. The parameter is only applied when the value is between 1 and 'numberOfDepartures'.", + "name": "numberOfDeparturesPerLineAndDestinationDisplay", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "defaultValue": "departures", + "description": null, + "name": "arrivalDeparture", + "type": { + "kind": "ENUM", + "name": "ArrivalDeparture", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Parameters for indicating the only authorities and/or lines or quays to list estimatedCalls for", + "name": "whiteListed", + "type": { + "kind": "INPUT_OBJECT", + "name": "InputWhiteListed", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Only show estimated calls for selected modes.", + "name": "whiteListedModes", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "TransportMode", + "ofType": null + } + } + }, + { + "defaultValue": "false", + "description": "Indicates that realtime-cancelled trips should also be included.", + "name": "includeCancelledTrips", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": "List of visits to this stop place as part of vehicle journeys.", + "isDeprecated": false, + "name": "estimatedCalls", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "EstimatedCall", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get all situations active for the stop place. Situations affecting individual quays are not returned, and should be fetched directly from the quay.", + "isDeprecated": false, + "name": "situations", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PtSituationElement", + "ofType": null + } + } + } + } + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "PlaceInterface", + "ofType": null + } + ], + "kind": "OBJECT", + "name": "StopPlace", + "possibleTypes": null + }, + { + "description": "List of coordinates between two stops as a polyline", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "A list of coordinates encoded as a polyline string between two stops (see http://code.google.com/apis/maps/documentation/polylinealgorithm.html)", + "isDeprecated": false, + "name": "pointsOnLink", + "type": { + "kind": "OBJECT", + "name": "PointsOnLink", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Origin Quay", + "isDeprecated": false, + "name": "fromQuay", + "type": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Destination Quay", + "isDeprecated": false, + "name": "toQuay", + "type": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "StopToStopGeometry", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": "Walk only", + "isDeprecated": false, + "name": "foot" + }, + { + "deprecationReason": null, + "description": "Bike only. This can be used as access/egress, but transfers will still be walk only.", + "isDeprecated": false, + "name": "bicycle" + }, + { + "deprecationReason": null, + "description": "Bike to a bike parking area, then walk the rest of the way. Direct mode and access mode only.", + "isDeprecated": false, + "name": "bike_park" + }, + { + "deprecationReason": null, + "description": "Walk to a bike rental point, bike to a bike rental drop-off point, and walk the rest of the way. This can include bike rental at fixed locations or free-floating services.", + "isDeprecated": false, + "name": "bike_rental" + }, + { + "deprecationReason": null, + "description": "Walk to a scooter rental point, ride a scooter to a scooter rental drop-off point, and walk the rest of the way. This can include scooter rental at fixed locations or free-floating services.", + "isDeprecated": false, + "name": "scooter_rental" + }, + { + "deprecationReason": null, + "description": "Car only. Direct mode only.", + "isDeprecated": false, + "name": "car" + }, + { + "deprecationReason": null, + "description": "Start in the car, drive to a parking area, and walk the rest of the way. Direct mode and access mode only.", + "isDeprecated": false, + "name": "car_park" + }, + { + "deprecationReason": null, + "description": "Walk to a pickup point along the road, drive to a drop-off point along the road, and walk the rest of the way. This can include various taxi-services or kiss & ride.", + "isDeprecated": false, + "name": "car_pickup" + }, + { + "deprecationReason": null, + "description": "Walk to an eligible pickup area for flexible transportation, ride to an eligible drop-off area and then walk the rest of the way.", + "isDeprecated": false, + "name": "flexible" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "StreetMode", + "possibleTypes": null + }, + { + "description": "A combination of street mode and corresponding duration", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": null, + "name": "streetMode", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "StreetMode", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "duration", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Duration", + "ofType": null + } + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "StreetModeDurationInput", + "possibleTypes": null + }, + { + "description": "Input format for specifying which modes will be allowed for this search. If this element is not present, it will default to all to foot.", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "The mode used to get from the origin to the access stops in the transit network the transit network (first-mile). If the element is not present or null,only transit that can be immediately boarded from the origin will be used.", + "name": "accessMode", + "type": { + "kind": "ENUM", + "name": "StreetMode", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "The mode used to get from the egress stops in the transit network tothe destination (last-mile). If the element is not present or null,only transit that can immediately arrive at the origin will be used.", + "name": "egressMode", + "type": { + "kind": "ENUM", + "name": "StreetMode", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "The mode used to get from the origin to the destination directly, without using the transit network. If the element is not present or null,direct travel without using transit will be disallowed.", + "name": "directMode", + "type": { + "kind": "ENUM", + "name": "StreetMode", + "ofType": null + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "StreetModes", + "possibleTypes": null + }, + { + "description": "Built-in String", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "String", + "possibleTypes": null + }, + { + "description": "A system notice is used to tag elements with system information for debugging or other\nsystem related purpose. One use-case is to run a routing search with\n`itineraryFilters.debug=listAll`. This will then tag itineraries instead of removing\nthem from the result. This make it possible to inspect the itinerary-filter-chain. A\nSystemNotice only have english text, because the primary user are technical staff, like\ntesters and developers.\n\n**NOTE!** _A SystemNotice is for debugging the system, avoid putting logic on it in the\nclient. The tags and usage may change without notice._", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "tag", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "text", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "SystemNotice", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "TariffZone", + "possibleTypes": null + }, + { + "description": "Time using the format: `HH:MM:SS`. Example: `18:25:43`", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "Time", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "Local time", + "isDeprecated": false, + "name": "time", + "type": { + "kind": "SCALAR", + "name": "Time", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Number of days offset from base line time", + "isDeprecated": false, + "name": "dayOffset", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "TimeAndDayOffset", + "possibleTypes": null + }, + { + "description": "Scheduled passing times. These are not affected by real time updates.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "quay", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Quay", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Scheduled time of arrival at quay", + "isDeprecated": false, + "name": "arrival", + "type": { + "kind": "OBJECT", + "name": "TimeAndDayOffset", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Scheduled time of departure from quay", + "isDeprecated": false, + "name": "departure", + "type": { + "kind": "OBJECT", + "name": "TimeAndDayOffset", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether this is a timing point or not. Boarding and alighting is not allowed at timing points.", + "isDeprecated": false, + "name": "timingPoint", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether vehicle may be boarded at quay.", + "isDeprecated": false, + "name": "forBoarding", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether vehicle may be alighted at quay.", + "isDeprecated": false, + "name": "forAlighting", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Whether vehicle will only stop on request.", + "isDeprecated": false, + "name": "requestStop", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Earliest possible departure time for a service journey with a service window.", + "isDeprecated": false, + "name": "earliestDepartureTime", + "type": { + "kind": "OBJECT", + "name": "TimeAndDayOffset", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Latest possible (planned) arrival time for a service journey with a service window.", + "isDeprecated": false, + "name": "latestArrivalTime", + "type": { + "kind": "OBJECT", + "name": "TimeAndDayOffset", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "serviceJourney", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ServiceJourney", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "destinationDisplay", + "type": { + "kind": "OBJECT", + "name": "DestinationDisplay", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "notices", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Notice", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Booking arrangements for this passing time.", + "isDeprecated": false, + "name": "bookingArrangements", + "type": { + "kind": "OBJECT", + "name": "BookingArrangement", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "TimetabledPassingTime", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": null, + "name": "costLimitFunction", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DoubleFunction", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": null, + "name": "intervalRelaxFactor", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "TransitGeneralizedCostFilterParams", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "air" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "bus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "cableway" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "water" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "funicular" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "lift" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "rail" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "metro" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "taxi" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "tram" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "trolleybus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "monorail" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "coach" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "unknown" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "TransportMode", + "possibleTypes": null + }, + { + "description": "Used to specify board and alight slack for a given modes.", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "The slack used for all given modes.", + "name": "slack", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "List of modes for which the given slack apply.", + "name": "modes", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "TransportMode", + "ofType": null + } + } + } + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "TransportModeSlack", + "possibleTypes": null + }, + { + "description": "Used to specify board and alight slack for a given modes.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "slack", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "modes", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "TransportMode", + "ofType": null + } + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "TransportModeSlackType", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "A transportMode that should be allowed for this search. You can furthernarrow it down by specifying a list of transportSubModes", + "name": "transportMode", + "type": { + "kind": "ENUM", + "name": "TransportMode", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "The allowed transportSubModes for this search. If this element is notpresent or null, it will default to all transportSubModes for the specifiedTransportMode. Be aware that all transportSubModes have an associated TransportMode, which must match what is specified in the transportMode field.", + "name": "transportSubModes", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "TransportSubmode", + "ofType": null + } + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "TransportModes", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "unknown" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "undefined" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "internationalFlight" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "domesticFlight" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "intercontinentalFlight" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "domesticScheduledFlight" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "shuttleFlight" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "intercontinentalCharterFlight" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "internationalCharterFlight" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "roundTripCharterFlight" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "sightseeingFlight" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "helicopterService" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "domesticCharterFlight" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "SchengenAreaFlight" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "airshipService" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "shortHaulInternationalFlight" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "canalBarge" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "localBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "regionalBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "expressBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "nightBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "postBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "specialNeedsBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "mobilityBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "mobilityBusForRegisteredDisabled" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "sightseeingBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "shuttleBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "highFrequencyBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "dedicatedLaneBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "schoolBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "schoolAndPublicServiceBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "railReplacementBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "demandAndResponseBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "airportLinkBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "internationalCoach" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "nationalCoach" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "shuttleCoach" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "regionalCoach" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "specialCoach" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "schoolCoach" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "sightseeingCoach" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "touristCoach" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "commuterCoach" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "funicular" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "streetCableCar" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "allFunicularServices" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "undefinedFunicular" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "metro" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "tube" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "urbanRailway" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "cityTram" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "localTram" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "regionalTram" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "sightseeingTram" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "shuttleTram" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "trainTram" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "telecabin" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "cableCar" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "lift" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "chairLift" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "dragLift" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "telecabinLink" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "local" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "highSpeedRail" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "suburbanRailway" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "regionalRail" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "interregionalRail" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "longDistance" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "international" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "sleeperRailService" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "nightRail" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "carTransportRailService" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "touristRailway" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "airportLinkRail" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "railShuttle" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "replacementRailService" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "specialTrain" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "crossCountryRail" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "rackAndPinionRailway" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "internationalCarFerry" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "nationalCarFerry" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "regionalCarFerry" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "localCarFerry" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "internationalPassengerFerry" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "nationalPassengerFerry" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "regionalPassengerFerry" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "localPassengerFerry" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "postBoat" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "trainFerry" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "roadFerryLink" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "airportBoatLink" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "highSpeedVehicleService" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "highSpeedPassengerService" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "sightseeingService" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "schoolBoat" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "cableFerry" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "riverBus" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "scheduledFerry" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "shuttleFerryService" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "communalTaxi" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "charterTaxi" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "waterTaxi" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "railTaxi" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "bikeTaxi" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "blackCab" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "miniCab" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "allTaxiServices" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "hireCar" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "hireVan" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "hireMotorbike" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "hireCycle" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "allHireVehicles" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "TransportSubmode", + "possibleTypes": null + }, + { + "description": "How much the factors safety, slope and distance are weighted relative to each other when routing bicycle legs. In total all three values need to add up to 1.", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "How important is bicycle safety expressed as a fraction of 1.", + "name": "safety", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "How important is slope/elevation expressed as a fraction of 1.", + "name": "slope", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "How important is time expressed as a fraction of 1. Note that what this really optimises for is distance (even if that means going over terrible surfaces, so I might be slower than the safe route).", + "name": "time", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "TriangleFactors", + "possibleTypes": null + }, + { + "description": "Description of a travel between two places.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "The time and date of travel", + "isDeprecated": false, + "name": "dateTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The trip request metadata.", + "isDeprecated": false, + "name": "metadata", + "type": { + "kind": "OBJECT", + "name": "TripSearchData", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The origin", + "isDeprecated": false, + "name": "fromPlace", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Place", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The destination", + "isDeprecated": false, + "name": "toPlace", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Place", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "A list of possible trip patterns", + "isDeprecated": false, + "name": "tripPatterns", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "TripPattern", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": "Use routingErrors instead", + "description": "A list of possible error messages as enum", + "isDeprecated": true, + "name": "messageEnums", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": null, + "description": null, + "name": "language", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "deprecationReason": "Use routingErrors instead", + "description": "A list of possible error messages in cleartext", + "isDeprecated": true, + "name": "messageStrings", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "A list of routing errors, and fields which caused them", + "isDeprecated": false, + "name": "routingErrors", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "RoutingError", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Information about the timings for the trip generation", + "isDeprecated": false, + "name": "debugOutput", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "debugOutput", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Use the cursor to get the previous page of results. Use this cursor for the pageCursor parameter in the trip query in order to get the previous page.\nThe previous page is a set of itineraries departing BEFORE the first itinerary in this result.", + "isDeprecated": false, + "name": "previousPageCursor", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Use the cursor to get the next page of results. Use this cursor for the pageCursor parameter in the trip query in order to get the next page.\nThe next page is a set of itineraries departing AFTER the last itinerary in this result.", + "isDeprecated": false, + "name": "nextPageCursor", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "Trip", + "possibleTypes": null + }, + { + "description": "A collection of selectors for what lines/trips should be included in / excluded from search", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "A list of selectors for what lines/trips should be allowed during search. In order to be accepted a trip/line has to match with at least one selector. An empty list means that everything should be allowed. ", + "name": "select", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "TripFilterSelectInput", + "ofType": null + } + } + } + }, + { + "defaultValue": null, + "description": "A list of selectors for what lines/trips should be excluded during the search. If line/trip matches with at least one selector it will be excluded.", + "name": "not", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "TripFilterSelectInput", + "ofType": null + } + } + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "TripFilterInput", + "possibleTypes": null + }, + { + "description": "A list of selectors for filter allow-list / exclude-list. An empty list means that everything is allowed. A trip/line will match with selectors if it matches with all non-empty lists. The `select` is always applied first, then `not`. If only `not` not is present, the exclude is applied to the existing set of lines. ", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "Set of ids for lines that should be included in/excluded from search", + "name": "lines", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + } + }, + { + "defaultValue": null, + "description": "Set of ids for authorities that should be included in/excluded from search", + "name": "authorities", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + } + }, + { + "defaultValue": null, + "description": "Set of ids for service journeys that should be included in/excluded from search", + "name": "serviceJourneys", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + } + }, + { + "defaultValue": null, + "description": "The allowed modes for the transit part of the trip. Use an empty list to disallow transit for this search. If the element is not present or null, it will default to all transport modes.", + "name": "transportModes", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "TransportModes", + "ofType": null + } + } + } + }, + { + "defaultValue": null, + "description": "Set of ids for group of lines that should be included in/excluded from the search", + "name": "groupOfLines", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "TripFilterSelectInput", + "possibleTypes": null + }, + { + "description": "List of legs constituting a suggested sequence of rides and links for a specific trip.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": "Replaced with expectedStartTime", + "description": "Time that the trip departs.", + "isDeprecated": true, + "name": "startTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "Replaced with expectedEndTime", + "description": "Time that the trip arrives.", + "isDeprecated": true, + "name": "endTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The aimed date and time the trip starts.", + "isDeprecated": false, + "name": "aimedStartTime", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The expected, realtime adjusted date and time the trip starts.", + "isDeprecated": false, + "name": "expectedStartTime", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The aimed date and time the trip ends.", + "isDeprecated": false, + "name": "aimedEndTime", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The expected, realtime adjusted date and time the trip ends.", + "isDeprecated": false, + "name": "expectedEndTime", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Duration of the trip, in seconds.", + "isDeprecated": false, + "name": "duration", + "type": { + "kind": "SCALAR", + "name": "Long", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "NOT IMPLEMENTED.", + "isDeprecated": false, + "name": "directDuration", + "type": { + "kind": "SCALAR", + "name": "Long", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "How much time is spent waiting for transit to arrive, in seconds.", + "isDeprecated": false, + "name": "waitingTime", + "type": { + "kind": "SCALAR", + "name": "Long", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Total distance for the trip, in meters. NOT IMPLEMENTED", + "isDeprecated": false, + "name": "distance", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "How much time is spent walking, in seconds.", + "isDeprecated": false, + "name": "walkTime", + "type": { + "kind": "SCALAR", + "name": "Long", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "How far the user has to walk, bike and/or drive in meters. It includes all street(none transit) modes.", + "isDeprecated": false, + "name": "streetDistance", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "Replaced by `streetDistance`.", + "description": null, + "isDeprecated": true, + "name": "walkDistance", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "A list of legs. Each leg is either a walking (cycling, car) portion of the trip, or a ride leg on a particular vehicle. So a trip where the use walks to the Q train, transfers to the 6, then walks to their destination, has four legs.", + "isDeprecated": false, + "name": "legs", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Leg", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Get all system notices.", + "isDeprecated": false, + "name": "systemNotices", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "SystemNotice", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Generalized cost or weight of the itinerary. Used for debugging.", + "isDeprecated": false, + "name": "generalizedCost", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "A cost calculated to distribute wait-time and avoid very short transfers. This field is meant for debugging only.", + "isDeprecated": false, + "name": "waitTimeOptimizedCost", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "A cost calculated to favor transfer with higher priority. This field is meant for debugging only.", + "isDeprecated": false, + "name": "transferPriorityCost", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "TripPattern", + "possibleTypes": null + }, + { + "description": "Trips search metadata.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "This is the time window used by the raptor search. The input searchWindow is an optional parameter and is dynamically assigned if not set. OTP might override the value if it is too small or too large. When paging OTP adjusts it to the appropriate size, depending on the number of itineraries found in the current search window. The scaling of the search window ensures faster paging and limits resource usage. The unit is seconds.", + "isDeprecated": false, + "name": "searchWindowUsed", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": "Use pageCursor instead", + "description": "This is the suggested search time for the \"next page\" or time window. Insert it together with the 'searchWindowUsed' in the request to get a new set of trips following in the time-window AFTER the current search.", + "isDeprecated": true, + "name": "nextDateTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "Use pageCursor instead", + "description": "This is the suggested search time for the \"previous page\" or time-window. Insert it together with the 'searchWindowUsed' in the request to get a new set of trips preceding in the time-window BEFORE the current search.", + "isDeprecated": true, + "name": "prevDateTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "TripSearchData", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "Start of validity period", + "isDeprecated": false, + "name": "startTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "End of validity period. Will return 'null' if validity is open-ended.", + "isDeprecated": false, + "name": "endTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "ValidityPeriod", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "normal" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "transit" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "bikePark" + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "bikeShare" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "VertexType", + "possibleTypes": null + }, + { + "description": "An acceptable combination of trip patterns between two segments of the via search", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "The index of the trip pattern in the segment before the via point", + "isDeprecated": false, + "name": "from", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The index of the trip pattern in the segment after the via point", + "isDeprecated": false, + "name": "to", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "ViaConnection", + "possibleTypes": null + }, + { + "description": "Input format for specifying a location through either a place reference (id), coordinates or both. If both place and coordinates are provided the place ref will be used if found, coordinates will only be used if place is not known. The location also contain information about the minimum and maximum time the user is willing to stay at the via location.", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "The name of the location. This is pass-through informationand is not used in routing.", + "name": "name", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "The id of an element in the OTP model. Currently supports Quay, StopPlace, multimodal StopPlace, and GroupOfStopPlaces.", + "name": "place", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "Coordinates for the location. This can be used alone or as fallback if the place id is not found.", + "name": "coordinates", + "type": { + "kind": "INPUT_OBJECT", + "name": "InputCoordinates", + "ofType": null + } + }, + { + "defaultValue": "\"PT5M\"", + "description": "The minimum time the user wants to stay in the via location before continuing his journey", + "name": "minSlack", + "type": { + "kind": "SCALAR", + "name": "Duration", + "ofType": null + } + }, + { + "defaultValue": "\"PT1H\"", + "description": "The maximum time the user wants to stay in the via location before continuing his journey", + "name": "maxSlack", + "type": { + "kind": "SCALAR", + "name": "Duration", + "ofType": null + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "ViaLocationInput", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "The set of access/egress/direct modes to be used for this search.", + "name": "modes", + "type": { + "kind": "INPUT_OBJECT", + "name": "StreetModes", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "A list of filters for which trips should be included. A trip will be included if it matches with at least one filter. An empty list of filters means that all trips should be included.", + "name": "filters", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "TripFilterInput", + "ofType": null + } + } + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "ViaSegmentInput", + "possibleTypes": null + }, + { + "description": "Description of a trip via one or more intermediate locations. For example from A, via B, then C to D.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "A list of segments of the via search. The first segment is from the start location to the first entry in the locations list and the last is from the last entry in the locations list to the end location.", + "isDeprecated": false, + "name": "tripPatternsPerSegment", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ViaTripPatternSegment", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "A list of the acceptable combinations of the trip patterns in this segment and the next segment.", + "isDeprecated": false, + "name": "tripPatternCombinations", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ViaConnection", + "ofType": null + } + } + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "A list of routing errors, and fields which caused them", + "isDeprecated": false, + "name": "routingErrors", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "RoutingError", + "ofType": null + } + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "ViaTrip", + "possibleTypes": null + }, + { + "description": "A segment of the via search. The first segment is from the start location to the first entry in the locations list and the last is from the last entry in the locations list to the end location.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "A list of trip patterns for this segment of the search", + "isDeprecated": false, + "name": "tripPatterns", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "TripPattern", + "ofType": null + } + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "ViaTripPatternSegment", + "possibleTypes": null + }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": "There is no accessibility information for the stopPlace/quay.", + "isDeprecated": false, + "name": "noInformation" + }, + { + "deprecationReason": null, + "description": "Wheelchair boarding/alighting is not possible at this stop.", + "isDeprecated": false, + "name": "notPossible" + }, + { + "deprecationReason": null, + "description": "Boarding wheelchair-accessible serviceJourneys is possible at this stopPlace/quay.", + "isDeprecated": false, + "name": "possible" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "WheelchairBoarding", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "The __Directive type represents a Directive that a server supports.", + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isRepeatable", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "locations", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "__DirectiveLocation", + "ofType": null + } + } + } + } + }, + { + "args": [ + { + "defaultValue": "false", + "description": null, + "name": "includeDeprecated", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "args", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__InputValue", + "ofType": null + } + } + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "__Directive", + "possibleTypes": null + }, + { + "description": "An enum describing valid locations where a directive can be placed", + "enumValues": [ + { + "deprecationReason": null, + "description": "Indicates the directive is valid on queries.", + "isDeprecated": false, + "name": "QUERY" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on mutations.", + "isDeprecated": false, + "name": "MUTATION" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on subscriptions.", + "isDeprecated": false, + "name": "SUBSCRIPTION" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on fields.", + "isDeprecated": false, + "name": "FIELD" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on fragment definitions.", + "isDeprecated": false, + "name": "FRAGMENT_DEFINITION" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on fragment spreads.", + "isDeprecated": false, + "name": "FRAGMENT_SPREAD" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on inline fragments.", + "isDeprecated": false, + "name": "INLINE_FRAGMENT" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on variable definitions.", + "isDeprecated": false, + "name": "VARIABLE_DEFINITION" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on a schema SDL definition.", + "isDeprecated": false, + "name": "SCHEMA" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on a scalar SDL definition.", + "isDeprecated": false, + "name": "SCALAR" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on an object SDL definition.", + "isDeprecated": false, + "name": "OBJECT" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on a field SDL definition.", + "isDeprecated": false, + "name": "FIELD_DEFINITION" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on a field argument SDL definition.", + "isDeprecated": false, + "name": "ARGUMENT_DEFINITION" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on an interface SDL definition.", + "isDeprecated": false, + "name": "INTERFACE" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on an union SDL definition.", + "isDeprecated": false, + "name": "UNION" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on an enum SDL definition.", + "isDeprecated": false, + "name": "ENUM" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on an enum value SDL definition.", + "isDeprecated": false, + "name": "ENUM_VALUE" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on an input object SDL definition.", + "isDeprecated": false, + "name": "INPUT_OBJECT" + }, + { + "deprecationReason": null, + "description": "Indicates the directive is valid on an input object field SDL definition.", + "isDeprecated": false, + "name": "INPUT_FIELD_DEFINITION" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "__DirectiveLocation", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isDeprecated", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "deprecationReason", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "__EnumValue", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": "false", + "description": null, + "name": "includeDeprecated", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "args", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__InputValue", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "type", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isDeprecated", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "deprecationReason", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "__Field", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "type", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "defaultValue", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isDeprecated", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "deprecationReason", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "__InputValue", + "possibleTypes": null + }, + { + "description": "A GraphQL Introspection defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, the entry points for query, mutation, and subscription operations.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "A list of all types supported by this server.", + "isDeprecated": false, + "name": "types", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The type that query operations will be rooted at.", + "isDeprecated": false, + "name": "queryType", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "If this server supports mutation, the type that mutation operations will be rooted at.", + "isDeprecated": false, + "name": "mutationType", + "type": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "'A list of all directives supported by this server.", + "isDeprecated": false, + "name": "directives", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Directive", + "ofType": null + } + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "'If this server support subscription, the type that subscription operations will be rooted at.", + "isDeprecated": false, + "name": "subscriptionType", + "type": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "__Schema", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "kind", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "__TypeKind", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [ + { + "defaultValue": "false", + "description": null, + "name": "includeDeprecated", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "fields", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Field", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "interfaces", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "possibleTypes", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": "false", + "description": null, + "name": "includeDeprecated", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "enumValues", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__EnumValue", + "ofType": null + } + } + } + }, + { + "args": [ + { + "defaultValue": "false", + "description": null, + "name": "includeDeprecated", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + ], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "inputFields", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__InputValue", + "ofType": null + } + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "ofType", + "type": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "specifiedByURL", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": "This legacy name has been replaced by `specifiedByURL`", + "description": null, + "isDeprecated": true, + "name": "specifiedByUrl", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "__Type", + "possibleTypes": null + }, + { + "description": "An enum describing what kind of type a given __Type is", + "enumValues": [ + { + "deprecationReason": null, + "description": "Indicates this type is a scalar. 'specifiedByURL' is a valid field", + "isDeprecated": false, + "name": "SCALAR" + }, + { + "deprecationReason": null, + "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.", + "isDeprecated": false, + "name": "OBJECT" + }, + { + "deprecationReason": null, + "description": "Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.", + "isDeprecated": false, + "name": "INTERFACE" + }, + { + "deprecationReason": null, + "description": "Indicates this type is a union. `possibleTypes` is a valid field.", + "isDeprecated": false, + "name": "UNION" + }, + { + "deprecationReason": null, + "description": "Indicates this type is an enum. `enumValues` is a valid field.", + "isDeprecated": false, + "name": "ENUM" + }, + { + "deprecationReason": null, + "description": "Indicates this type is an input object. `inputFields` is a valid field.", + "isDeprecated": false, + "name": "INPUT_OBJECT" + }, + { + "deprecationReason": null, + "description": "Indicates this type is a list. `ofType` is a valid field.", + "isDeprecated": false, + "name": "LIST" + }, + { + "deprecationReason": null, + "description": "Indicates this type is a non-null. `ofType` is a valid field.", + "isDeprecated": false, + "name": "NON_NULL" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "__TypeKind", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "totalTime", + "type": { + "kind": "SCALAR", + "name": "Long", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "debugOutput", + "possibleTypes": null + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "URI", + "isDeprecated": false, + "name": "uri", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "Label", + "isDeprecated": false, + "name": "label", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "infoLink", + "possibleTypes": null + }, + { + "description": "A connection to a list of items.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "a list of edges", + "isDeprecated": false, + "name": "edges", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "placeAtDistanceEdge", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "details about this specific page", + "isDeprecated": false, + "name": "pageInfo", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "placeAtDistanceConnection", + "possibleTypes": null + }, + { + "description": "An edge in a connection", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "The item at the end of the edge", + "isDeprecated": false, + "name": "node", + "type": { + "kind": "OBJECT", + "name": "PlaceAtDistance", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "cursor marks a unique position or index into the connection", + "isDeprecated": false, + "name": "cursor", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "placeAtDistanceEdge", + "possibleTypes": null + }, + { + "description": "A connection to a list of items.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "a list of edges", + "isDeprecated": false, + "name": "edges", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "quayAtDistanceEdge", + "ofType": null + } + } + }, + { + "args": [], + "deprecationReason": null, + "description": "details about this specific page", + "isDeprecated": false, + "name": "pageInfo", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "quayAtDistanceConnection", + "possibleTypes": null + }, + { + "description": "An edge in a connection", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "The item at the end of the edge", + "isDeprecated": false, + "name": "node", + "type": { + "kind": "OBJECT", + "name": "QuayAtDistance", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "cursor marks a unique position or index into the connection", + "isDeprecated": false, + "name": "cursor", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "quayAtDistanceEdge", + "possibleTypes": null + } + ] + } + } +} \ No newline at end of file diff --git a/src/transportation.rs b/src/transportation.rs new file mode 100644 index 0000000..e05bfc4 --- /dev/null +++ b/src/transportation.rs @@ -0,0 +1,45 @@ +use std::collections::HashMap; +use ::reqwest::blocking::Client; +use reqwest::header; +use graphql_client::{reqwest::post_graphql_blocking as post_graphql, GraphQLQuery}; +use slint::VecModel; + +const BASE_URL: &str = "https://api.entur.io/journey-planner/v3/graphql"; +// https://developer.entur.org/pages-intro-authentication +const ET_CLIENT: &str = "knowit-objectnet-trd-infoscreen"; +const HAAKON_VII_GATE: &str = "NSR:StopPlace:42310"; +const DEFAULT_TIME_RANGE: i32 = 72100; +const DEFAULT_NUMBER_OF_DEPARTURES: i32 = 10; + +type Date = String; +type DateTime = String; + +#[derive(GraphQLQuery)] +#[graphql( +schema_path = "src/resources/journey-planner_schema.json", +query_path = "src/resources/journey-planner_query.graphql", +response_derives = "Debug" +)] +struct StopPlace; + +pub fn test_graph_ql() -> Result<(), Box> { + + let mut headers = header::HeaderMap::new(); + headers.insert("Accept", header::HeaderValue::from_static("application/json")); + headers.insert("ET-Client-Name",header::HeaderValue::from_static(ET_CLIENT)); + + // get a client builder + let client = Client::builder() + .default_headers(headers) + .build()?; + + let variables = stop_place::Variables { + id: HAAKON_VII_GATE, + timeRange: DEFAULT_TIME_RANGE, + numberOfDepartures: DEFAULT_NUMBER_OF_DEPARTURES, + }; + + let response_body = + post_graphql::(&client, BASE_URL, variables).unwrap(); + +} \ No newline at end of file From ab49020f1032a083389e3dc01cafd182097f4b6f Mon Sep 17 00:00:00 2001 From: andpas Date: Thu, 22 Feb 2024 15:31:25 +0100 Subject: [PATCH 02/11] Add graphql library. --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index a1a791a..6a821de 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ selfie = [] [dependencies] chrono = { version = "0.4.26", features = ["serde", "unstable-locales"] } image = "0.24.7" +graphql_client = { version = "0.13.0", features = ["reqwest-blocking"] } reqwest = { version = "0.11.23", features = [ "json", "rustls-tls", From d1d3a8fc9f72a264455d3aa54ba9a333d2307f55 Mon Sep 17 00:00:00 2001 From: andpas Date: Fri, 1 Mar 2024 17:26:08 +0100 Subject: [PATCH 03/11] Some elements of the first stopPlaceRow displayed. --- src/main.rs | 4 +- src/transportation.rs | 45 ------------- src/transportation/mod.rs | 134 ++++++++++++++++++++++++++++++++++++++ ui/mainwindow.slint | 15 +++++ ui/transportation.slint | 70 ++++++++++++++++++++ 5 files changed, 220 insertions(+), 48 deletions(-) delete mode 100644 src/transportation.rs create mode 100644 src/transportation/mod.rs create mode 100644 ui/transportation.slint diff --git a/src/main.rs b/src/main.rs index a1a8c0e..0e03ff6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,6 @@ use log::info; use rust_embed::RustEmbed; use slint::PlatformError; use ui::*; -use crate::transportation::test_graph_ql; mod calendar; mod datetime; @@ -25,13 +24,12 @@ fn main() -> Result<(), PlatformError> { env_logger::init(); info!("Starting up..."); - test_graph_ql(); - let main_window = MainWindow::new().unwrap(); forecast::setup(&main_window); xkcd::setup(&main_window); food::setup(&main_window); calendar::setup(&main_window); + transportation::setup(&main_window); //we need to store the timers in variables to prevent them from being dropped let _t = datetime::setup(&main_window); diff --git a/src/transportation.rs b/src/transportation.rs deleted file mode 100644 index e05bfc4..0000000 --- a/src/transportation.rs +++ /dev/null @@ -1,45 +0,0 @@ -use std::collections::HashMap; -use ::reqwest::blocking::Client; -use reqwest::header; -use graphql_client::{reqwest::post_graphql_blocking as post_graphql, GraphQLQuery}; -use slint::VecModel; - -const BASE_URL: &str = "https://api.entur.io/journey-planner/v3/graphql"; -// https://developer.entur.org/pages-intro-authentication -const ET_CLIENT: &str = "knowit-objectnet-trd-infoscreen"; -const HAAKON_VII_GATE: &str = "NSR:StopPlace:42310"; -const DEFAULT_TIME_RANGE: i32 = 72100; -const DEFAULT_NUMBER_OF_DEPARTURES: i32 = 10; - -type Date = String; -type DateTime = String; - -#[derive(GraphQLQuery)] -#[graphql( -schema_path = "src/resources/journey-planner_schema.json", -query_path = "src/resources/journey-planner_query.graphql", -response_derives = "Debug" -)] -struct StopPlace; - -pub fn test_graph_ql() -> Result<(), Box> { - - let mut headers = header::HeaderMap::new(); - headers.insert("Accept", header::HeaderValue::from_static("application/json")); - headers.insert("ET-Client-Name",header::HeaderValue::from_static(ET_CLIENT)); - - // get a client builder - let client = Client::builder() - .default_headers(headers) - .build()?; - - let variables = stop_place::Variables { - id: HAAKON_VII_GATE, - timeRange: DEFAULT_TIME_RANGE, - numberOfDepartures: DEFAULT_NUMBER_OF_DEPARTURES, - }; - - let response_body = - post_graphql::(&client, BASE_URL, variables).unwrap(); - -} \ No newline at end of file diff --git a/src/transportation/mod.rs b/src/transportation/mod.rs new file mode 100644 index 0000000..19e4bd1 --- /dev/null +++ b/src/transportation/mod.rs @@ -0,0 +1,134 @@ +use reqwest; +use reqwest::header; +use graphql_client::{GraphQLQuery, Response}; +use std::error::Error; +use std::rc::Rc; +use std::thread; +use chrono::DateTime as ChronoDateTime; +use slint::{ComponentHandle, SharedString, VecModel, Weak}; +use crate::transportation::stop_place::{ResponseData, StopPlaceStopPlace}; +use crate::ui::{MainWindow, StopPlaceData, StopPlaceDataRow}; + +const BASE_URL: &str = "https://api.entur.io/journey-planner/v3/graphql"; +// https://developer.entur.org/pages-intro-authentication +const ET_CLIENT: &str = "knowit-objectnet-trd-infoscreen"; +const HAAKON_VII_GATE: &str = "NSR:StopPlace:42310"; +const DEFAULT_TIME_RANGE: i64 = 72100; +const DEFAULT_NUMBER_OF_DEPARTURES: i64 = 10; + +type Date = String; +type DateTime = String; + +#[derive(GraphQLQuery)] +#[graphql( + schema_path = "src/resources/journey-planner_schema.json", + query_path = "src/resources/journey-planner_query.graphql", + response_derives = "Debug" +)] +struct StopPlace; + + +pub fn setup(window: &MainWindow) { + let window_weak = window.as_weak(); + thread::spawn(move || { + tokio::runtime::Runtime::new() + .unwrap() + .block_on(transportation_worker_loop(window_weak)) + }); +} + +async fn transportation_worker_loop(window: Weak) { + loop { + let result = get_stop_place().await; + if result.is_ok() { + let option_stop_place = result.unwrap().stop_place; + if option_stop_place.is_some() { + let stop_place = option_stop_place.unwrap(); + display_transportation(&window, stop_place) + } + } + tokio::time::sleep(std::time::Duration::from_secs(60 * 60)).await; + } +} + +fn display_transportation(window_weak: &Weak, stop_place: StopPlaceStopPlace) { + + window_weak + .upgrade_in_event_loop(move |window: MainWindow| { + + let transport_mode = stop_place + .estimated_calls.get(0).unwrap() + .service_journey.journey_pattern.as_ref().unwrap() + .line.transport_mode.as_ref().unwrap(); + + let public_code = stop_place + .estimated_calls.get(0).unwrap() + .service_journey.journey_pattern.as_ref().unwrap() + .line.public_code.as_ref().unwrap(); + + let destination_front_text = stop_place + .estimated_calls.get(0).unwrap() + .destination_display.as_ref().unwrap() + .front_text.as_ref().unwrap(); + + let aimed_departure_time = &stop_place + .estimated_calls.get(0).unwrap() + .aimed_departure_time; + + let custom_format = aimed_departure_time.as_str(); + //let custom_format_2 = aimed_departure_time.fmt(); + + println!("{:#?}", destination_front_text); + + let stop_place_data_rows: VecModel = VecModel::default(); + + let stop_place_data_row = StopPlaceDataRow { + transportMode: SharedString::from("bus"), + publicCode: SharedString::from(public_code), + destinationFrontText: SharedString::from(destination_front_text), + aimedDepartureTime: SharedString::from(custom_format), + }; + + stop_place_data_rows.push(stop_place_data_row); + + let stop_place_data = StopPlaceData { + stopName: SharedString::from(stop_place.name), + stopDataRows: Rc::new(stop_place_data_rows).into() + }; + + let all_stops_data: VecModel = VecModel::default(); + + all_stops_data.push(stop_place_data); + + window.set_stopPlacesData(Rc::new(all_stops_data).into()) + }) + .unwrap(); +} + +pub async fn get_stop_place() -> Result> { + + let mut headers = header::HeaderMap::new(); + headers.insert("Accept", header::HeaderValue::from_static("application/json")); + headers.insert("ET-Client-Name",header::HeaderValue::from_static(ET_CLIENT)); + + let variables = stop_place::Variables { + id: HAAKON_VII_GATE.to_string(), + time_range: Some(DEFAULT_TIME_RANGE), + number_of_departures: Some(DEFAULT_NUMBER_OF_DEPARTURES), + }; + + let request_body = StopPlace::build_query(variables); + + let client = reqwest::Client::new(); + + let res = client.post(BASE_URL) + .headers(headers) + .json(&request_body) + .send().await?; + + let response_body: Response = res.json().await?; + + println!("{:#?}", response_body); + + Ok(response_body.data.expect("Missing response data")) +} diff --git a/ui/mainwindow.slint b/ui/mainwindow.slint index bed27dd..9241257 100644 --- a/ui/mainwindow.slint +++ b/ui/mainwindow.slint @@ -4,6 +4,7 @@ import { GridBox , HorizontalBox} from "std-widgets.slint"; import { Xkcd, XkcdWidget } from "xkcdwidget.slint"; import { ForecastWidget, Forecast } from "forecastwidget.slint"; import { FoodTrackerWidget, FoodTracking} from "foodtrackerwidget.slint"; +import { StopPlaceData, TransportationWidget } from "transportation.slint"; import { CalendarWidget, Event } from "calendarwidget.slint"; import "./assets/Bagoss.ttf"; import "./assets/FiraMono-Regular.ttf"; @@ -38,6 +39,16 @@ export component MainWindow inherits Window { date: "31. April", }]; + in property <[StopPlaceData]> stopPlacesData: [{ + stopName: "Placeholder", + stopDataRows: [{ + transportMode: "Spark", + publicCode: 0, + destinationFrontText: "Månen", + aimedDepartureTime: "Nå", + }] + }]; + title: "Infoskjerm"; //TODO: Set programmatically? no-frame: true; @@ -77,6 +88,10 @@ export component MainWindow inherits Window { tracking: foodTracking; } + TransportationWidget { + stopPlacesData: stopPlacesData; + } + CalendarWidget { events: events; meetings: []; diff --git a/ui/transportation.slint b/ui/transportation.slint new file mode 100644 index 0000000..e571c62 --- /dev/null +++ b/ui/transportation.slint @@ -0,0 +1,70 @@ +export struct StopPlaceDataRow { + transportMode: string, + publicCode: string, + destinationFrontText: string, + aimedDepartureTime: string, +} + +export struct StopPlaceData { + stopName: string, + stopDataRows: [StopPlaceDataRow] +} + +component StopPlaceRow { + in property stopPlaceDataRow; + + HorizontalLayout { + spacing: 1.5rem; + alignment: center; + Text { + font-size: 3rem; + text: stopPlaceDataRow.transportMode; + color: whitesmoke; + } + Text { + font-size: 3rem; + text: stopPlaceDataRow.publicCode; + color: whitesmoke; + } + Text { + font-size: 3rem; + text: stopPlaceDataRow.destinationFrontText; + color: whitesmoke; + } + Text { + font-size: 3rem; + text: stopPlaceDataRow.aimedDepartureTime; + color: yellow; + } + } +} + +component StopPlaceColumn { + in property stopPlaceData; + + VerticalLayout { + alignment: start; + padding-top: 2rem; + + Text { + color: whitesmoke; + font-size: 4rem; + text: stopPlaceData.stopName; + horizontal-alignment: center; + } + + for stopPlaceRow in stopPlaceData.stopDataRows : StopPlaceRow { + stopPlaceDataRow: stopPlaceRow; + } + } +} + +export component TransportationWidget{ + in property <[StopPlaceData]> stopPlacesData; + + HorizontalLayout { + for stopPlace in stopPlacesData : StopPlaceColumn { + stopPlaceData: stopPlace; + } + } +} \ No newline at end of file From 2fa96ce427a46e12cae550952628bf9019dedf1e Mon Sep 17 00:00:00 2001 From: andpas Date: Mon, 5 Aug 2024 00:23:26 +0200 Subject: [PATCH 04/11] Example of entire stop place quay with time formatting. --- Cargo.lock | 96 ++++- Cargo.toml | 1 - README.md | 8 + img/transport/bus.png | Bin 0 -> 1505 bytes img/transport/bus_alert.png | Bin 0 -> 2490 bytes img/transport/rail.png | Bin 0 -> 1650 bytes img/transport/rail_alert.png | Bin 0 -> 2608 bytes img/transport/train.png | Bin 0 -> 1648 bytes img/transport/tram.png | Bin 0 -> 1638 bytes img/transport/walk.png | Bin 0 -> 2405 bytes img/transport/water.png | Bin 0 -> 2298 bytes src/resources/journey-planner_query.graphql | 55 +-- src/resources/journey-planner_schema.json | 453 +++++++++++++++++--- src/transportation/mod.rs | 174 ++++++-- ui/mainwindow.slint | 2 +- ui/transportation.slint | 12 +- 16 files changed, 670 insertions(+), 131 deletions(-) create mode 100644 img/transport/bus.png create mode 100644 img/transport/bus_alert.png create mode 100644 img/transport/rail.png create mode 100644 img/transport/rail_alert.png create mode 100644 img/transport/train.png create mode 100644 img/transport/tram.png create mode 100644 img/transport/walk.png create mode 100644 img/transport/water.png diff --git a/Cargo.lock b/Cargo.lock index 660792c..8a3521a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -276,6 +276,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + [[package]] name = "async-broadcast" version = "0.5.1" @@ -1042,6 +1048,19 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + [[package]] name = "combine" version = "4.6.7" @@ -2182,6 +2201,65 @@ dependencies = [ "gl_generator", ] +[[package]] +name = "graphql-introspection-query" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2a4732cf5140bd6c082434494f785a19cfb566ab07d1382c3671f5812fed6d" +dependencies = [ + "serde", +] + +[[package]] +name = "graphql-parser" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ebc8013b4426d5b81a4364c419a95ed0b404af2b82e2457de52d9348f0e474" +dependencies = [ + "combine 3.8.1", + "thiserror", +] + +[[package]] +name = "graphql_client" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cdf7b487d864c2939b23902291a5041bc4a84418268f25fda1c8d4e15ad8fa" +dependencies = [ + "graphql_query_derive", + "reqwest", + "serde", + "serde_json", +] + +[[package]] +name = "graphql_client_codegen" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a40f793251171991c4eb75bd84bc640afa8b68ff6907bc89d3b712a22f700506" +dependencies = [ + "graphql-introspection-query", + "graphql-parser", + "heck 0.4.1", + "lazy_static", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 1.0.109", +] + +[[package]] +name = "graphql_query_derive" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00bda454f3d313f909298f626115092d348bc231025699f557b27e248475f48c" +dependencies = [ + "graphql_client_codegen", + "proc-macro2", + "syn 1.0.109", +] + [[package]] name = "h2" version = "0.3.26" @@ -2790,6 +2868,7 @@ version = "0.1.0" dependencies = [ "chrono", "env_logger", + "graphql_client", "ical", "image 0.24.9", "log", @@ -2902,7 +2981,7 @@ checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", "cfg-if 1.0.0", - "combine", + "combine 4.6.7", "jni-sys", "log", "thiserror", @@ -5506,6 +5585,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + [[package]] name = "untrusted" version = "0.9.0" @@ -5593,6 +5681,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + [[package]] name = "vtable" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index 6a821de..eb701f9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,6 @@ reqwest = { version = "0.11.23", features = [ "json", "rustls-tls", ], default-features = false } -graphql_client = { version = "0.13.0", features = ["reqwest-blocking"] } serde = { version = "1.0.183", features = ["derive"] } serde_json = "1.0.104" serde_with = "3.4.0" diff --git a/README.md b/README.md index 45d0ce4..2daf173 100644 --- a/README.md +++ b/README.md @@ -47,3 +47,11 @@ GUI-koden eksponerar også typar, som `Forecast`-structen i [weatherwidget.slint * Koderydding * Feilhåndtering * Fikse minnelekkasje? + +## Vedlikehold + +### Oppdater skjema-definisjoner fra EnTurs API. + +```shell +graphql-client introspect-schema "https://api.entur.io/journey-planner/v3/graphql" --output "src/resources/journey-planner_schema.json" +``` diff --git a/img/transport/bus.png b/img/transport/bus.png new file mode 100644 index 0000000000000000000000000000000000000000..13de93ecaa57cd87515ea019dfa5daf2c3228cf0 GIT binary patch literal 1505 zcmb7EYd8~n9RBa>GHZm8oo738J;<1{!fA7mdyL%5t%RmXBgI4~T@-azIFe?^HN+|n zF_|u;bXmxK6LroQ%)1@=RW-2_kDiP^ZUJD-sjEm^w^D7+^h%yKs!6xQ)L|b zedLic9L-B4$p}KH?zRIpud(9*AZ|L_Q+!SaPZhkpjNPl&*5duj2`V6X5BFfE*iqZJ zGLQm6x_!Nu1`Yl*#VSH|2B(|_Ux(mOwaNu1@uM!!&Q+y<4UF=nxbsz>X_Z%1HYMQ& z1pTgr5~3FNEU{vO{$;3Qyi55xe`$iTxH6n9@fBE7c6q4c%ZIr;)Y8VB*+7PHY<;gf z8(nmAbBCAu<~NLM;qzfLnT+25eeO2o*I z!82hEVN*{=jG!qm*5#^oVuY6| zgylw~J&uqEqaPEY`DLBey^{TQvB^aFGPkcpBwIakgNhifTBdj`tBcDQg*`4;0bbde z#1AOd^OugJk+@2^PxU3IpMg=5@LJKl(I#Bk`EmLgN8ZeYSiE?Rav72yH*1-;sHcCa z^3Zgxl>M#dX$u6<%^>3{85u>ijAJE%Ga1Xy9}bNVFZPD2CU0ow!}k2)^K2 ze+keXhrCtCD|!ABvIt6$r4VOn@4$i5vD!xnXS53}dqO?UlJZwDL>`v?;zuM3L*C3! z>U9m_`lo6<5W=#Ty}>*9xg^AQE59F*W|lx_XRbvmBS>L2)_?2(26NK>szq%Mr)f~^ z=MR)7tK`LJE)V-#6)J12T)b zm8k^RyJ6Wp^y9ezn%|v!L!4uP`Zp|#w&b7d8Cm@L^wlUG*D056bt~!{z#?zogj689 zpFTi)HSAV8-)q7(?&^)EK@{<9UE!abghCW!gl_5!l#uptA4YL+kAgm_INpR zhIVL@oEz{Hw@LL~By@09QI3scyNbsBuuDlu2wTIf?NBrBQmX&mAkwe zfchqxyOMIM`An=sd^vcOfLF~dHu_3;aV-oA)(Va-mrHVDEQHKBg*W0>si?LX?WjpV zdnC|ZEv(S03vmf}@$F^c$S$!O*_ejYpABZ_8CK@*NZ|%oV`VAgq>(;dc()Q;M9OS307Bc_83!iB;ij5{Tcj~?a#fGeUGGbJw;OYQ$aS$>l5?H< z#u3cBD|I#Vp9)*xuQk&?^k3>cV(SZ(p7@5-B=?}9aq34V3pvb3Ne#=auy_;|EX8&x z;v*v(p~sOCjf^J{f-ReO=AY)s8w(N!%EA_p_+w731k8Hei0*C*es}7^*Z^n7)R1P7 zN+@RP$?J6b8n0yq(2n*rEJS0;nhC$c1qW|H53b$zHQmLkcu!?Ux3ob%p3MiY9d3zaoei8FJnU=iLVy1kC)cM% literal 0 HcmV?d00001 diff --git a/img/transport/bus_alert.png b/img/transport/bus_alert.png new file mode 100644 index 0000000000000000000000000000000000000000..c55d62b53304335f1214728d32ac8421f7963e90 GIT binary patch literal 2490 zcmV;r2}SmaP)Px;bV)=(RCr$PoqdcPWgW-AzuDehH5OrK=VkA>D5fVZXe2E}F;t5&5fI-%OUg_6 zN97+)NT?FqCKMwk3dp~LCdx}e4qM|}&`2ziMnRz@z9F=}rQN%onVl_iMeOa(^V8Y( z;&JKjJoC)V&hFmKKW#I=x99trXP%ka-%JU`ma77kYxW{J3II7D1O{4I$(Tr+$=wpBvyO2B@NK;{&mm)Gy!)rK~RFwBt4JWajNMwyHJ^?5&#m zCsqA30WdQ&^G1w}tS<>#&xG{^S{MEa#(LF47yW{kST`{dy&yWS{}=8&ylcrJKL&`j-jdag`jlslQH(y6dw_90s;jP5m)h-`D_r-#>35 zz?T`gS~f`7m4_5 zQG@NaKV<-5rdz94`Rh?N$pP?=-3%7@L7VZ06thX zD;uL~k_6!Y7L1Fcf@QOx@376vu1>KVjk)y;V*bxbbEgd;tY?)rdS0cn=7nyxMFMad z$F5=__9h*msy_$f(rVRsvXj5#HLqjlhg9P)`egxth_1Jc@}5Kh>YjfO7&j*!psIh+ z5*sHbjDwxe|K4sQ?Kai;Spr}dw^uD=cR~QoAAtGeNe8IvPh47SS!e#WlYd%|9kQ4K zVBTX}mFtrMaGTEqe1WQfN&Pq&HLKM%UPl0)|1=oyPMRkZ0EB03Lw`>~0RAxmXC@t> zs{h=-%B!cQ=tSpJkngMB{Vt7}1psC=tCp@O1)%gyL{;$Re#?bfzJJy!0Hme$Y2!oz zsIP!iP_8pzq=Yx?y8g-vUWC;i%ceCgMoKte*Y%D!T8`)6#*D6)dNQ?Su?7%fw`J(J zXSxPNog!ogpTs7u8?hucbn;E-Ml9loiM#=X4OS)A{*r}&Nn-{i)ey+2@lD{8Pk-B0+8ZRp>Q$~hDO!j?m(`6EfX z-oocLqpP&(P_X$0u_ej#rLcRBcyv;xg>fhVgrYfKa}P6L8+F8W+Q0Ov>+GzznM&Gz z)mTLIuw|5`+G2(Vz>M46q!FF~^Qek&OD}iZKfea}lS&*A%?ri{W&1{l2EfT#;BRNf zohrhGryvNN{M|vrX4O*=5xx+oUv#JdoVp_VKJ~a|W)ZkbpXks5I5iWF^r~TOQGC_@ z(4hnnic)v|KLB`#%IQeKN2xC~%rmqAPC{tx1n4UYg2r%(-w(PpcwzuCDoxFlG`iKQ zMEBgBS`$7+K-jGNhSUl;8R#_zZj93hdb<1r37|a?$ve$9ght~c5){6u5%#kxch8*? zFaWTZHNH!>|FawT!37X9V7}V2D*I%Q>{`vA)K<|}khmspBNu}Yg0)A*0zV?tawuEV zKm%x>1_E(Kx4xlHLWB)n0k<{?5lj(i?de`qW$H8s_-jiuk{3>APj z1mHjk^d-|QALuu+hwC!5tGaZ8h<9+%y4SYtSNj>n(9M9?iA^{H#y-|~Pa4(&Q>mxG&-CkIpb^Y)G zS^Ed@w6?7B4I}_T;=*ymc&?kcGoH6mW9`{A0A!hO@BlFGvn~B58DZ;=e=i81m9gz; zlX1R*10a~Uja!umWkj8E8aHS}56IYdvdKE%zyaVuJEvMb>mM?r&dwftE0sj}hP(2X zb-sZEFjB&#uIoo-6!m@o>{fut*ZI4}$~xb`0f_UtmNc%0vd%Yf0K#i=%P4P?nE{U1 zd?4vPLDu;O4nQcp%u$)f(Z2{e%Y6L+AbdY-jm#0f)TZ0Dd7AeCi#apOH)orAx}UpT zCS>HD@T}W-kw9;c3!rV!xKDr&kSMi3aLQV+NdsMy_}afyF)8O`@Jm&*a<033(DKN3Lr-DM{HI?E#Z zH8wHcYgu~xNp4nKB!Dn+-Dx}xqQoD>$Z8Oo#ASZQwklmew2?+$IRJHUD>UulG!hO> z3?Z(yZR3%w>y-i!7U8)5UIwnpx}biDPryFQ)O+$>RA~S+Gc#||M#dgb;{)9NAachV z2rr1%iOa{w$N$-jI;8=$XMyj3hy(nr7lq}OgG#u}()FMBDt{~h?FCu!o65Z!P|`eE zKYCbRUjbm5A_ah?hj2pw0zg6mle!NbfL;%1Ie@rpROPFKPvV0zj-~ zDE2AH@%$Py#$~b)Va77_2^rh0Z2G<4*Z}HIoG#3%UL@gWm^){|({Njh*mi2+P!!|3jTDCPTm0s|+9ukyc{N z0zl5x3jhUxoE6A9eK7+H068m=bNXTi6aaEoAm{Y|1^8Wlo#EDep8x;=07*qoM6N<$ Ef}Vh(fB*mh literal 0 HcmV?d00001 diff --git a/img/transport/rail.png b/img/transport/rail.png new file mode 100644 index 0000000000000000000000000000000000000000..d7904db6ee1af150945e53291e2c27ca55f165ec GIT binary patch literal 1650 zcmb7_Sx}RA6vh8vFbP|v62%Y|qLcz+3K&5IA_<#Bfg($=tO+t8ZefuSQX?NA$ljm` zX%z`Bh@xmqG@wGML@1^rtD&F}R!LX{6+tvmoauwFeYp3`ocZ1JbY^arx7QwwCSDT& zfT6j&_^c@7%c!GP_K+aac156gpFK{Xs&%6R0Ms^`3)PPkI#uGCyVez#F>oit-#xdc zlk|$Tp_uVF)Z?>S_=$oX?kWp)JXSr_1>@$YOU7A9T(Fx1 zGIZ~8*|MSh`cGW?{@C=AC68+S&ZeW!Cj+`k&$_<7Fj=ltDR0l;xHL6Ab$fG9Kmb-) zm46(42H7_1%76}l5HF#$vCpUhF&>8qG3Ymd^cp-6^~;q(rlO2t4p+mMDcBY2bef6q z50~U*MsHRpg|*DfU4hlnkz}nu>ypx?AL${9J>qmDh4i|WcnPOp z=J@bpa-x@WP}u?XHX;jmS+N&Dlhva*h>ZM=vNdLy6m z9(oI{84s}X4b>MTq7Jqvf;_VdD_O|No1|l}>+%p4G80z#;a6G})?naeZQZn)AQqBa zNgU|6iyUo6B{;ZxE=G$={$W*f;m1j3M^$#v$-gBWH?Tl`|2>TM#7zf!K5l{16Y_^Y z3p>-;;1rIh(==!2`N4;XoU55wU0*IeM+f%^i&-!;WQ=>S)m7w{5t0~u#_lV z^vmTt&(dfX+Y?-vGLD_OzFPSJ%L{`t%|dtieQ$WdTv*Mlar$lX_jBJE^FE=$!Ne!=_eI#Eu%G*(!7}#Z z-cRo_upp_EAJ8lFVnj{kFf`*vym z9<0i`UZqxn-hVFTPd2?ge|LO{Rs;`2X}J2@&b8&y35RtB!S8SJ1>*;#J)6=TuhhgW zbQF{YR<0Y*ztyUW`nZl2WQ6k8xvZvr>y52MN})7RpC{P3mtTe`!$=gFXjKqEObL7c zvV-)cD$IpExTgWvbsjssJ3%^KHVYee3#e& zFh!W$fUA*l*GwGto7vylOFjZwRv-H(wK1u0Q{vKKdu+O*yJ}*|W*JY~O9W?~RH9fz zD|*tUct3nS9TXEzKRffwN8+X??mg5R^3eGl*2LTEQ|b%N-Z&eXNT8$G-m@=3)8&YC zbZCzqIU3CuXr+d^3Caf|nqJvGV^`{}*=-y;Q;{__nFric!^g~3mc4GmPteHWiNzm< zKa)7gard1g#yV|sAwgZ>#N60T+$@<8SWc1R91w($>Ssf_Dyq=einHz<+pVpQeo~3sBJItX{Cs}JESzW<%?(}wB1W!+WzH@d`DJ!iT2(#iBjB zF~7dBg+<9HyhuG$Y(?qD&d))>Oyfroz3;D>he(F4T=cdU&A0jU6l>>_y>LLy>%t#M zei46=t<@0I5IstSMW?mJK_ElT%bW#WHIArxg|OTh6PTn$AZ~7)(t`)#&Zj{jT0{T1 f7-*v}(w8ibK4m5MSw+cLo(Q11dbw0NF;f2pG34)+ literal 0 HcmV?d00001 diff --git a/img/transport/rail_alert.png b/img/transport/rail_alert.png new file mode 100644 index 0000000000000000000000000000000000000000..936b93713cfbd086b128088ebe597df084d42a9b GIT binary patch literal 2608 zcmV-03eWY4P)Px;>PbXFRCr$PoqdcPWgW-Azu9}KhC;iu^RhiI0dp5ykVx7Rh0+LyKMaCVks<GQYRy`vhl-`xYc09vEKND#ce2ZfaY53%537&OEJ!?GGOupfdCkU{$aIxvOkr2)(O zdmfc`)E?mbM_ob3uVKcm1YDj(PzLr8;ZcM8pSA6?DoK1B*>(f~&kHYwL3aRH!^}N8 z;t|mlfb9|E!6kNaw@$3-y-hd3T=%a8;l~NMj~QoYS}V~6fj2ppxm71_(*gLt?@j=& zfr3k5mjD+;4nQs#^6x$Y(NCa$fER$MA507W|9{@)+UEOJ2JHp4dzpE?ifvjO26mQh z^CM~fa{(|qI{H@h_AV<3TE>KB1X?Qp1!Gy-LQnZclVa(>K>P{O^TQnsq!uPgokTd~ zSmt07pHsG(0XXFQ7xz-(y@K(fq$fD_!s+X-UECCBU-7C>fas<;yNuWW$+gXklE%~m z;2l2vHlB<=3&xcI-kCIcLVIuWIIkESER8hs^Str3Oybdmu`@E~&8}U#J4vwA0KA}f zJHVTnac+`?X>H#;iQZp!%r7+Z_xtmrB1^sUr~pDgLCu zb}%kf37(S3H*wyNhWm96}FS@z21|aL{G5Rhjl@|WBQEjmR zyz2OeS%{sw15E4Bk+`y4ww|x&?*+A+nE8pc@lW~X0f2~ZcC6wyEdZ4ud;pAfx&ut> zA5DrC0|VB+`p5rZ3z2bW+W2__U>0|k9czmwfZ9*M{6XCTru8Q-3^~rCf7bKQ>ajx} zdjOcXxlZY3Jpg{~Wq>bEE1<3)M}2m=yfCN>AP9d0#=CU$3Th}t*tqC9;2e3$Y zfNA}YyjEN=JWR*yAA-U#?cMLpn0WwTMy>3arY?X~&qUG+KHG1$FtgW>d0hZmX??~x zaR4eEa0qJY9?)CBIi_j8-oYo~bdP1T+AVquxX?7sx;I*05Z=j*hL?IOwd8RQAi@^M zGVjXu91wSiP#L_AO;$HzIyKbu&E`fd=EX#-0mufc0vmtJLqOe_5s9U74PCL1BI4c* zwHkmFY0M9I=l32u9R}IRRkqF5ao%kKK=%HC@x8dgHg!GW6Ru@`KQ3om0FW(*OcMun zy58h-o4y`nyA*6#Aes=2t5o|&+Xldiy&zoA zjC<1vCl5goIPu=Wz!hl^K}7gsl77*)0&wz*=*QILmYGw))AWh99e|U2!og-WjGYoc zZGUK60+6Cq{P2$e-jU{Tl)@)fU#QH}wg65*sBQx2YbgXx;F7!_bY^gE00}D1%#;k; z;FRKfZcd&Pt|ve?>%Jwk0!{=v#=xyf`asW=e_jHZ9*E+d<}`$A^%4>!Kh%)@tf{-_ zP6`+S*vSTORqg+51b+SkkPMiwbDYxCs$2HRNH}Qp(2XE*L()br2JZtKPl+l1kxI*< zYEAPR!1Q4t5?43s8>%OSZ0L%3a=8%EFoA~7^qDGy4;V&ae}Q`U#Wh%|3O?Izz5|fs z8JXm%s|OwD4{1ecrC&P$kO!lG0ld+*P1&M8ua-6ea6)tW70uDtYa54$hwHYn%r!b~ z1z;Kiu%`g}iftG7%r&vw>oT;Vx^$d~H*z%jkn6f{%w-U5w+EaiHsK%`PqV?>vbbi? z17v#xn4uVfekCA&P_|2tmOPhCoLFevZgE#4JV_7%>bSihz+fh(?A_Hh~2} zun_1kTh`hCNGq<2-<$+MM2`#RXZi~GwH(Amgi8&gYnk~Ll|f}`lXut0oCDD4L+3F+ zln>UXUz|5<=_mk##L6X>wYQPDqd~C3VB@7OfUFf@JnTB=?J8j_Uic6QpH#8cwdt5W zKrpXe;*=g&5p2|}-eM3vredpW(=h-zGR`lT7r&|^*x1e62(i-usKko1=@rg>@R)lkO(kk|f>Ra_glMauPFPEGXA`FBVdPPo2h5vQW?Ag zfa*6Gv_U0UyV(%<9>*?yInQy$0tkY`%Oj2&KA*|6z*fdCP+^5-Evh?HOBS`o0+2~6 zUibnCmt~P~-o#+M=sM=Ayz5m15QOW%Xwj5qc}q|yKH+n&WqvE~>`DN9-#<&BXLl>7 zt;t)6)8o@C2BucqwtY13yh;G3?>@coGA6u`cR_O@J~37~j`?CUYEcF-4I!v~ikZLL zjKW%#gNQ!uSj7jMl|K;xSyT|zu8EkRX;y*F%u^t`*0PGvHZx~p0J1pWe{Gm)>O0K1 zs+q;+m5T_wh8UhNRopB7Cs zM??420A@z@yxJ-O@c|GG8K5Bs%b$bF`ja4C9gY!bzW^Tq^MN;KWB;k+6kC2#kqLmA z%2XPx*DoI2^RCr$PonMF*RUF5^zqztnyO?`t=g++mlww#t6s;g?Jtg*%6+{w51%dYG z$q@SYl0B6#)RcDK!80hD|YSO6A4$qtm<-p&9EpkxP1Zf|FR z1prJCW9fMJE8W^exB{j&gWKuPU~a>4 zu5`brQ(?-nNcsOZ4kmw3l^W$1Me$cVzdC5n3z~RvUJ(oj^k`G)cF7U%{U5&J`TO=Vbvg% z1Bjw%Ih;kinXy5&*wX6>Yzag63za&Q0%$f{4>R#zX56Dv;>?Wj0j_M8OOrFm3rP$0pJ9H^~Rbg zA)JA8HQ&8gqJ;b}J11NSvGcQ{9Rg3l+V4kJL6k7nr z{8Aom0Vub$SV0S*m|x1HEdb?~7At506!S}Yv<0Bt(qaWIfMR|rkG24mTUxB31yIZ{ z<~&$`Jd z+2|0C;@rS zYhwPJ=6=Qj5X>*sgR%X29G#4&pLdA%<%yjuMt48s0C2~-yH*?hEsv?)g`6tl*F3Rv z#pv#59DoWfse9h=R31~)+ue=)Dkfj(%a8C z07VwMn2O>Zvd;v%`xyryJ@N(Pv3lSh?Rguj@L51-ztRCj&7{S^Xr5EbjWNCM&66a# z@9z$NDO$5vypDbZTnc=*Dx*`yUqz%3OXKqr!Pq0x)e1%B_|TA;{i}nuU~#|fX=hF? z>ieAueRuV|_WgR2G=Qj?9N=q9P%gNQfP;bWZkE|`1puZ$V9=W~B23LC@Xo*=drL;Y zG=Mn%{hV85Bnazdgcz60I28u2^dco{0K~~Q zFg`TSL>a+^*F(?!NTx)Zs{}x^*&GpAbR6IZWd)g$PiGy>KH~fSWm&yS0Hh+KC|SpZ zld^(L$S217AaK)l@}xIq0J;$3)+@~XnY5|_E(2X#;Shh$w2U7vLv}cojga0IVz`vX8M70H0%~a}MZG5LC6_RP+VF z%?9Ru&tK$S{#=my*=s%rO5XvLVMrN0^TOyWfHI9Jvv)5TeFHEE1`L9Rn_=_?z##4T zAZbZqXa_K8JDl$HAZgMLAZxLUYtIbo{v}A>i(g&{vcGiC(o;HsGR*(ilspiO2at6H zEc9{hGhm?`oVEWJK$b(A$1MQO24|JG0J0p?JZ=GKHaM%i1(4;C=5Y%^v%y*AEr2YC uG>=;Vnhnk>ZvkXEqdv4tXdelA35q+Yd*nyQ5?} z@{qNRP#fngoSO_iaOhzaIwjHx2Z;`2VI23l|2hBOe|+BW>v~_W&*#6-^}fK|=ZisO z(EtDpeGiSb>f!$#Bw|(H=bv(4HCQ6c*9XX+S&RXIz|m>mZ2rN?qPA^_#H$MK?9)p{raHDiFjE$jo8vJY2dH&g(B#zn@> zyz5%$m#j6xjz23!;M$9iq^-~}d2!v^cai0X^h1AfVJIX8EMzH7*u za|yMZjk_ptOQ%!d<*?Di0 z(~OMlA03)Y9c^}h=dKQ5&)>D6c9xvRh}}5m4m1zR^N_0LQU-|uBj3M{!l(F3TO>Vr zNk%rOggNYI21qeek=$WFb`Q0ucStMq__Ok20R!l?l>C4UdhT?Homs(p=@k2>Kc{DK z&wV0HHJg5x_IQHjD(yDcv|BotTus>szy0B(^2P!OzSH2sGSO^gO-@8sp126wt|NK;C0C-WkrOy535#Ox33TXxfUOuQb^G%qI@X2JLZ zz9`Moczsll@$n}$Pm7IL(BR3(XjSLmk;b9T>h!MnVS1~tWj)TT8=Wz`(1MSPV}BR- zZPjx+GllVQmUoT^p`cgak7kDFZd*Q*SE;HT&$LdcL8;ddelB(j~Zb`!>nsHO`8U)OHv|CN_DwJtnU>y4F^Z z3xgc+se38p%^nh-{YnMM+7UUDcNf?1C)QL?{B-QusM*qy)O$PGlHVsb<<2$EJw`6+ z7|CHV7^tR^n^+Xu!5Pj8r`T&}-*%LCSWvCfK6FL1 zOs}tLcg>7pJ$;<7J VSz%JNsbaM_0Dad!n#?CW{Vz54Px;A4x<(RCr$PoqdcQRT;*gckY%##Ma*V-n6zvR-gnGLyCk}>qo(&CMMNr*CGf) zO)VeBj}k3LqS06(YU^SHkpxm)HAZ7Jf{jM7iX}vv{!y{EkhGPZIWzYR)MDtz?!0D} zt}e^oxpU^u-8*+X^XKmSyl39$H|NgWGv}O3sE)2WKwWLUY8(}SE?)!{fC@mD9q4lN zRS&2D6ytywM5_t$Y64xr;I}4O3AC5N`x)9Ju2p}en3jsoGAnw3FB&^Q^odk!m>+g* zV_mWKwV$o$0r-Jr6&oB&FICN@IvEuslh`15;no=O_f>QnwA(Ce!B!PbCu4gSfQX_i zd6fU0#~kXT<#xUPmps~{H9ZT!6OADv+K|T(X1>?8jnC%M7Om-70Dcht5#W{i457yy ztN!kM+G16`3qUji5Sh8`U=AJIuySb&7WFQGpy2~#=ktSwV;N39ZLzAJ1t0?XI|i=G zV+R2{ZA-s8kG5z{&jRp+##VrC$!7>}b1dW5eA;4FJqzHKp$GnL9y=IxO<9H}dKN%p ze5N6Ysf0>4B+=6V#vxQg5qUlYiq&Kpk|^5{#DoJq-vcHJNrookQ}G~?wiFy+JpOmm z_A$qQ*XC$HF3Zrv)Jt#H04TOk&0Mw$z|46)ZA(1`APA!6V;p~ohz0<93o|bw!boy2 z2KYC}YP4-Y*Z?Pw>zJ?>;A>h`_Y5;{b8X{?N-lIUxU>L-c*!2)<2PwU zYe875<`LiKSVn1Hx}=?Z=>Ygrz5`>p5lF6hyiU#d|3{NX*V;yXM_&C*=}H5@52Lk+ z;~PNqzG8|e*{8)T48wS)n0%ed(p3P=T=Rsyqo&by3=9-qB7q*Vt@?FE=Pfc{R{#XT z(eq=B-T~l~0Ok}~&})W%fRDMB{h@;{a4gD?4El5sk9OD;!WO=S{1gEXs1}qpJ|3mT{r&aBS>rnu*L48Rri+VE-p!29cdGEy zH|9adtPgjzjTXsE3&0cdQ6hAF@>FtTK6#?{)kTZuN8JEXN&w7!wjV|Z2w2#LDK7yy zHqs7CfX?mG71qGE7fDrNuCOnb5M#5o0y9J1U0LG%Md6*%IXqcFXZClUZ ze%1!Z*Rgf@X!T8ax_f{h%1?uFe;cRvQ^(RjJ`zMLH0B`?E>X@!_&s7g$3)K&;Sj|* z($~j_bzMKAoGV38P5^=YE`Zx}7aHSs$I-`^EG@jNE~Nie+}AN%UZCfR|u2}fFDGU0sOAE%p)9$nFjlyqOtqRw)#O&pD?4JtfTy1eXSY2xP>-g0z}nHtXk{ zM|50>=t>Z8X5js59?@4EtNu+jO=qJ^0l<@TDUD%Yda3lRW7YpR%>2rWdwGxQ_lBZ} z657R63IHOEKEuqZD;o)T(6;pJrxxr5jg18QI)FE1F{1)7jY}eo?qlYgQVoo8v*S#E zBlZ2p<*eae0=>NzgbKhk4*5bp0m2n&=EWK>?N3>7$IO}tqU1>`6=VfqIskz@3SeFe zfY`D0Opl&+Ien!n{(#+S3C zt^j0lX;O?I$R7c?A@v(D=mV}*&$K^W1waviCmK%@(X!MVu)(3r~%q)nwP7IF_Dy5>*920e~MygJ4b_DrWFT*D^A{C$0b} z0g&6lEry`S;+3vzKAtsg1t6HAfsD;Ad@9Tsawd$6kpbFnt#ifvI3xDlnA1y8GLDqMjSgDEgl#cIH8ia>H!(u z^26u^n9ph!&cH8ROIKdgRRPEVKuS69)EJU?08I}f++~~k*D|DgRY(OOgJXUeeGtsQ zPJIFbKI&R}>P>n&eFY!`01?V9%=ltjXpQDvXqxksx0I;>WB}lYayJ;4H~;+SJ+5W6 ze8FDzfDC3gF=;eydSN>ou2wyu1(X8^c<$@xN5@k?|Czqz+V$_`;adS{;hGR~6%$^w zL)K)O2CTL${m}|Q9tT=z{6HqN*peB}&5jpGYq(^guKz1f^HmRM)dK?gI0H?0E+Jr- zZRxppHmLx#?g6PkL7vPJb!{Wp?*u1JR{-*SZk)lIuFs4+gS{Uwy#mnXE1&|Px-v`IukRCr$Poo$RB z%Lfz#w)lw`zvw3@_(eqsDv26ewT5<4DHXS-4QkTFNLm|>wM0YP-I;smrQMVYWM|G_ z?{+t?b-VZ6Id^7uXYVAF-DLi+&+p!ubI+W6hDaY>Re)X1o+d{MpvwnA3LpjWzY3It znzU0B&&e&QgKj|;6AGUKXy@T)5IY56AW}O`QUL8#*C2KZz(AySnxp{Qsjfln6o7$9 z?KDXNv{PM!*eL)5k=kjJ0%)hY2C-8B1|qf7Bn4opZYij5BJ?JLYX!0%plcbj%kJV6 zJSLD60(GG1WDg`+P@;1|Wxu)$aA_766-TLUQh)h9{b zYg5Ex^%aq)if;ZsoBFK*l!N*qKt5tq#NzekVb95a)TVxW0Dd(9S+FT$(fW#1JU8#y z)Nc7T4@MY21tDyF}?&@PUV$bE90+?2%RH}Y}8Fd?= zZwGkY+(OH%fO<}vdS9`a|6>v`mNbCz;OvbQ{Ye5_LA)cDpn}%~*eg`O7;sj<9Lsl> z@sa`{A}R>#LqZt_7{0v>v?|;se&c}brEtIFWJgJA)3`kkpe(Y2wR1zd*}REVTLEeF z#2zamdauf4UXt9ZQIEVZAB>&^P%4!QWZ#gGLrQV82v(UMkxAN-IH$EdPmxiP#%Qrv ztXvwuX8??k*RN51G6Y}2;?RJ z%dCa!On^y<91voZ;1lzuT=3J;ozbg%SyBMq(|#&*R{@lQ`ptyw@3ID6O)ubZ(aFBp zY7w!%5i6I=D}c<$kWsfl@Wob>_M{*212pvuK=Zer=gm8`o!!3?fJ)^;v8mtqCdiur z;?5}`rj+6VjX^*i0q{Go@ zSxtwZGm%;Wa1_A$=u(!X#WByxZHUu(3jpem0P=90BumGZk9tn_YjOIG4WLx2y_*^Q zB~Fs1Vk=F&r&!GWHBP^=0ffQ*N_|p9`r;(&bz71Rw~&p!^s*%Y<)9WW#=5!JMUC0t zi=LAkj_K3dFKCo2^-n|OCvlVgzdfhlFXa*YSgk}zFhBVjuaNy|+$vf+1CkkzsvVxQ zdTQlyIXJr=(AK+8#cMv<{Beh$Ee}Iy97}%fH4@jvYx<(KK)z6P@;{#KTMDY5C-|dQ z;>GnzI==``72RCCd)TInZut!GEA_`j>Lp18I1Q1V?abfm z`+r!fEr6E*e0)w}MGit_&-wG`o?WwM&0BHApRql8^5pWBD_4CM*x{0nO@_qkW4fQ!v z4H6g>Vi1C>!-GhGF$%^=j)nh=(j&!uGIz?)sCv2lRJ_m4XLq%vzU>*%YSPs2zY18L z0jZGo3Zww+HMEM*H2}U}-J-!~!s->|Zr9C^SalN9x!d_?%I!FSa=CT`6ut^z+a;Rq zfyTEyFLxxSma)vcoj=j*fH<9x2enUR$U8-3-o5t;jA)VP`;?3n3Wf7=a$L@~QmL$L zXl_yDW&!5C*Ma1&rpWFAC->_la!18z>lrY;Kg32L6rDyZ#b%wFV<8BVzsvB7mkWgz zrKo0Rzdm(mr@VQih=^TT?;pyv*2@y;v!9>`mCi)pZf&QuM1C4MAWn$l33*;3DjtFpY znd&<&!U_F0HQ`=)@Gs~q%F(9Au?(6= z9mjdqM!;|$UL>;)3hMx_1Ev-Ngu5)xJj3wkW<5^wp}?Ywjx&QzG07*qoM6N<$g4PL6Q~&?~ literal 0 HcmV?d00001 diff --git a/src/resources/journey-planner_query.graphql b/src/resources/journey-planner_query.graphql index a6a40b8..2b3d3b2 100644 --- a/src/resources/journey-planner_query.graphql +++ b/src/resources/journey-planner_query.graphql @@ -1,31 +1,36 @@ -query StopPlace($id: String!, $timeRange: Int, $numberOfDepartures: Int) { +query Query($id: String!, $timeRange: Int, $numberOfDepartures: Int) { stopPlace(id: $id) { id name - estimatedCalls(timeRange: $timeRange, numberOfDepartures: $numberOfDepartures) { - realtime - aimedArrivalTime - aimedDepartureTime - expectedArrivalTime - expectedDepartureTime - actualArrivalTime - actualDepartureTime - date - forBoarding - forAlighting - destinationDisplay { - frontText - via - } - serviceJourney { - directionType - publicCode - journeyPattern { - line { - id - name - transportMode - publicCode + quays(filterByInUse: true) { + id + name + publicCode + estimatedCalls(timeRange: $timeRange, numberOfDepartures: $numberOfDepartures) { + realtime + aimedArrivalTime + aimedDepartureTime + expectedArrivalTime + expectedDepartureTime + actualArrivalTime + actualDepartureTime + date + forBoarding + forAlighting + destinationDisplay { + frontText + via + } + serviceJourney { + directionType + publicCode + journeyPattern { + line { + id + name + transportMode + publicCode + } } } } diff --git a/src/resources/journey-planner_schema.json b/src/resources/journey-planner_schema.json index 52a1fe2..4f5ffc0 100644 --- a/src/resources/journey-planner_schema.json +++ b/src/resources/journey-planner_schema.json @@ -104,6 +104,14 @@ "SCALAR" ], "name": "specifiedBy" + }, + { + "args": [], + "description": "Indicates an Input Object is a OneOf Input Object.", + "locations": [ + "INPUT_OBJECT" + ], + "name": "oneOf" } ], "mutationType": null, @@ -551,6 +559,12 @@ "isDeprecated": false, "name": "sameMode" }, + { + "deprecationReason": null, + "description": "Must match both subMode and mode", + "isDeprecated": false, + "name": "sameSubmode" + }, { "deprecationReason": null, "description": null, @@ -1367,6 +1381,16 @@ "name": "Coordinates", "possibleTypes": null }, + { + "description": "A cost value, normally a value of 1 is equivalent to riding transit for 1 second, but it might not depending on the use-case. Format: 3665 = DT1h1m5s = 1h1m5s", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "Cost", + "possibleTypes": null + }, { "description": "Local date using the ISO 8601 format: `YYYY-MM-DD`. Example: `2020-05-17`.", "enumValues": null, @@ -1531,7 +1555,7 @@ { "args": [], "deprecationReason": null, - "description": "Returns scheduled passingTimes for this dated service journey, updated with realtime-updates (if available). ", + "description": "Returns scheduled passingTimes for this dated service journey, updated with real-time-updates (if available). ", "isDeprecated": false, "name": "estimatedCalls", "type": { @@ -1632,7 +1656,7 @@ "possibleTypes": null }, { - "description": "A linear function to calculate a value(y) based on a parameter (x): `y = f(x) = a + bx`. It allows setting both a constant(a) and a coefficient(b) and the use those in the computation. Format: `a + b x`. Example: `1800 + 2.0 x`", + "description": "A double function `f(t)` is used to calculate a value based on a variable(t). The variable can\nbe the duration/time or cost for a leg or section of a path/itinerary. The function\n`f(t) = a + bt` has a constant(a) and a coefficient(b) that will be used in OTP to compute\n`f(t)`.\n\nFormat: `a + b t`. Example: `30m + 2.0 t`. The constant `a` accept both whole numbers and\nduration input format like: `60` = `60s` = `1m` and `3791` = `1h3m11s`. `b` must be a positive\ndecimal number between `0.0` and `100.0`.\n", "enumValues": null, "fields": null, "inputFields": null, @@ -1941,7 +1965,7 @@ { "args": [], "deprecationReason": null, - "description": "Whether stop is cancelled. This means that either the ServiceJourney has a planned cancellation, the ServiceJourney has been cancelled by realtime data, or this particular StopPoint has been cancelled. This also means that both boarding and alighting has been cancelled.", + "description": "Whether stop is cancelled. This means that either the ServiceJourney has a planned cancellation, the ServiceJourney has been cancelled by real-time data, or this particular StopPoint has been cancelled. This also means that both boarding and alighting has been cancelled.", "isDeprecated": false, "name": "cancellation", "type": { @@ -2717,7 +2741,7 @@ "possibleTypes": null }, { - "description": null, + "description": "Deprecated. Use STOP_INTERCHANGE_PRIORITY", "enumValues": [ { "deprecationReason": null, @@ -2793,7 +2817,7 @@ "inputFields": [ { "defaultValue": null, - "description": "Set a relative limit for all transit itineraries. The limit is calculated based on the transit itinerary generalized-cost and the time between itineraries Itineraries without transit legs are excluded from this filter. Example: costLimitFunction(x) = 3600 + 2.0 x and intervalRelaxFactor = 0.5. If the lowest cost returned is 10 000, then the limit is set to: 3 600 + 2 * 10 000 = 26 600 plus half of the time between either departure or arrival times of the itinerary. Default: {\"costLimitFunction\": 900.0 + 1.5 x, \"intervalRelaxFactor\": 0.75}", + "description": "Set a relative limit for all transit itineraries. The limit is calculated based on the transit itinerary generalized-cost and the time between itineraries Itineraries without transit legs are excluded from this filter. Example: costLimitFunction(x) = 3600 + 2.0 x and intervalRelaxFactor = 0.5. If the lowest cost returned is 10 000, then the limit is set to: 3 600 + 2 * 10 000 = 26 600 plus half of the time between either departure or arrival times of the itinerary. Default: {\"costLimitFunction\": 15m + 1.50 t, \"intervalRelaxFactor\": 0.75}", "name": "transitGeneralizedCostLimit", "type": { "kind": "INPUT_OBJECT", @@ -3108,7 +3132,7 @@ { "args": [], "deprecationReason": null, - "description": "The expected, realtime adjusted date and time this leg starts.", + "description": "The expected, real-time adjusted date and time this leg starts.", "isDeprecated": false, "name": "expectedStartTime", "type": { @@ -3140,7 +3164,7 @@ { "args": [], "deprecationReason": null, - "description": "The expected, realtime adjusted date and time this leg ends.", + "description": "The expected, real-time adjusted date and time this leg ends.", "isDeprecated": false, "name": "expectedEndTime", "type": { @@ -4397,7 +4421,7 @@ "possibleTypes": null }, { - "description": null, + "description": "OccupancyStatus to be exposed in the API. The values are based on GTFS-RT", "enumValues": [ { "deprecationReason": null, @@ -4407,31 +4431,43 @@ }, { "deprecationReason": null, - "description": "The vehicle or carriage has a large number of seats available.", + "description": "The vehicle is considered empty by most measures, and has few or no passengers onboard, but is\nstill accepting passengers. There isn't a big difference between this and `manySeatsAvailable`\nso it's possible to handle them as the same value, if one wants to limit the number of different\nvalues.\nSIRI nordic profile: merge these into `manySeatsAvailable`.\n", + "isDeprecated": false, + "name": "empty" + }, + { + "deprecationReason": null, + "description": "The vehicle or carriage has a large number of seats available.\nSIRI nordic profile: more than ~50% of seats available.\n", "isDeprecated": false, "name": "manySeatsAvailable" }, { "deprecationReason": null, - "description": "The vehicle or carriage has a few seats available.", + "description": "The vehicle or carriage has a few seats available.\nSIRI nordic profile: less than ~50% of seats available.\n", "isDeprecated": false, "name": "fewSeatsAvailable" }, { "deprecationReason": null, - "description": "The vehicle or carriage only has standing room available.", + "description": "The vehicle or carriage only has standing room available.\nSIRI nordic profile: less than ~10% of seats available.\n", "isDeprecated": false, "name": "standingRoomOnly" }, { "deprecationReason": null, - "description": "The vehicle or carriage is considered full by most measures, but may still be allowing passengers to board.", + "description": "The vehicle or carriage can currently accommodate only standing passengers and has limited\nspace for them. There isn't a big difference between this and `full` so it's possible to\nhandle them as the same value, if one wants to limit the number of different values.\nSIRI nordic profile: merge into `standingRoomOnly`.\n", + "isDeprecated": false, + "name": "crushedStandingRoomOnly" + }, + { + "deprecationReason": null, + "description": "The vehicle or carriage is considered full by most measures, but may still be allowing\npassengers to board.\n", "isDeprecated": false, "name": "full" }, { "deprecationReason": null, - "description": "The vehicle or carriage has no seats or standing room available.", + "description": "The vehicle or carriage has no seats or standing room available.\nSIRI nordic profile: if vehicle/carriage is not in use / unavailable, or passengers are only\nallowed to alight due to e.g. crowding.\n", "isDeprecated": false, "name": "notAcceptingPassengers" } @@ -4617,6 +4653,45 @@ "name": "PageInfo", "possibleTypes": null }, + { + "description": "Defines one point which the journey must pass through.", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "Optional name of the pass-through point for debugging and logging. It is not used in routing.", + "name": "name", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "defaultValue": null, + "description": "The list of *stop location ids* which define the pass-through point. At least one id is required.\nQuay, StopPlace, multimodal StopPlace, and GroupOfStopPlaces are supported location types.\nThe journey must pass through at least one of these entities - not all of them.", + "name": "placeIds", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "PassThroughPoint", + "possibleTypes": null + }, { "description": "A series of turn by turn instructions used for walking, biking and driving.", "enumValues": null, @@ -4768,6 +4843,55 @@ "name": "PathGuidance", "possibleTypes": null }, + { + "description": "A combination of street mode and penalty for time and cost.", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "List of modes with the given penalty is applied to. A street-mode should not be listed\nin more than one element. If empty or null the penalty is applied to all unlisted modes,\nit becomes the default penalty for this query.\n", + "name": "streetMode", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "StreetMode", + "ofType": null + } + } + }, + { + "defaultValue": null, + "description": "Penalty applied to the time for the given list of modes.\n", + "name": "timePenalty", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DoubleFunction", + "ofType": null + } + } + }, + { + "defaultValue": "1.0", + "description": " This is used to take the time-penalty and multiply by the `costFactor`.\n The result is added to the generalized-cost.\n", + "name": "costFactor", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "PenaltyForStreetMode", + "possibleTypes": null + }, { "description": "Common super class for all places (stop places, quays, car parks, bike parks and bike rental stations )", "enumValues": null, @@ -5401,6 +5525,18 @@ "ofType": null } }, + { + "args": [], + "deprecationReason": null, + "description": "Operator's version number for the situation element.", + "isDeprecated": false, + "name": "version", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, { "args": [], "deprecationReason": null, @@ -5662,7 +5798,7 @@ }, { "defaultValue": "86400", - "description": null, + "description": "Duration in seconds from start time to search forward for estimated calls. Must be a positive value. Default value is 24 hours", "name": "timeRange", "type": { "kind": "SCALAR", @@ -5726,7 +5862,7 @@ }, { "defaultValue": "false", - "description": "Indicates that realtime-cancelled trips should also be included.", + "description": "Indicates that real-time-cancelled trips should also be included.", "name": "includeCancelledTrips", "type": { "kind": "SCALAR", @@ -5808,7 +5944,7 @@ { "args": [], "deprecationReason": null, - "description": "the Quays part of an flexible group.", + "description": "the Quays part of a flexible group.", "isDeprecated": false, "name": "flexibleGroup", "type": { @@ -5913,7 +6049,7 @@ "args": [ { "defaultValue": null, - "description": "Date and time for the earliest time the user is willing to start the journey (if arriveBy=false/not set) or the latest acceptable time of arriving (arriveBy=true). Defaults to now", + "description": "The date and time for the earliest time the user is willing to start the journey (if `false` or not set) or the latest acceptable time of arriving (`true`). Defaults to now.", "name": "dateTime", "type": { "kind": "SCALAR", @@ -5921,6 +6057,16 @@ "ofType": null } }, + { + "defaultValue": null, + "description": "The date and time for the latest time the user is expected to book the journey.\nNormally this is when the search is performed (now), plus a small grace period to\ncomplete the booking. Services which must be booked before this time is excluded. The\n`latestBookingTime` and `minimumBookingPeriod` in `BookingArrangement` (flexible\nservices only) is used to enforce this. If this parameter is _not set_, no booking-time\nrestrictions are applied - all journeys are listed.\n", + "name": "bookingTime", + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, { "defaultValue": null, "description": "The length of the search-window in minutes. This parameter is optional.\n\nThe search-window is defined as the duration between the earliest-departure-time(EDT) and the latest-departure-time(LDT). OTP will search for all itineraries in this departure window. If `arriveBy=true` the `dateTime` parameter is the latest-arrival-time, so OTP will dynamically calculate the EDT. Using a short search-window is faster than using a longer one, but the search duration is not linear. Using a \"too\" short search-window will waste resources server side, while using a search-window that is too long will be slow.\n\nOTP will dynamically calculate a reasonable value for the search-window, if not provided. The calculation comes with a significant overhead (10-20% extra). Whether you should use the dynamic calculated value or pass in a value depends on your use-case. For a travel planner in a small geographical area, with a dense network of public transportation, a fixed value between 40 minutes and 2 hours makes sense. To find the appropriate search-window, adjust it so that the number of itineraries on average is around the wanted `numItineraries`. Make sure you set the `numItineraries` to a high number while testing. For a country wide area like Norway, using the dynamic search-window is the best.\n\nWhen paginating, the search-window is calculated using the `numItineraries` in the original search together with statistics from the search for the last page. This behaviour is configured server side, and can not be overridden from the client.\n\nThe search-window used is returned to the response metadata as `searchWindowUsed` for debugging purposes.", @@ -5979,6 +6125,24 @@ } } }, + { + "defaultValue": null, + "description": "The list of points the journey is required to pass through.", + "name": "passThroughPoints", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PassThroughPoint", + "ofType": null + } + } + } + }, { "defaultValue": "false", "description": "Whether the trip should depart at dateTime (false, the default), or arrive at dateTime. See `timetableView` for use-cases where this parameter is relevant.", @@ -6001,7 +6165,7 @@ }, { "defaultValue": "false", - "description": "When true, realtime updates are ignored during this search.", + "description": "When true, real-time updates are ignored during this search.", "name": "ignoreRealtimeUpdates", "type": { "kind": "SCALAR", @@ -6087,6 +6251,16 @@ } } }, + { + "defaultValue": "{ratio : 1.12, constant : \"12m\"}", + "description": "Relax generalized-cost when comparing trips with a different set of\ntransit-group-priorities. The groups are set server side for service-journey and\ncan not be configured in the API. This mainly helps to return competition neutral\nservices. Long distance authorities are put in different transit-groups.\n\nThis relaxes the comparison inside the routing engine for each stop-arrival. If two\npaths have a different set of transit-group-priorities, then the generalized-cost\ncomparison is relaxed. The final set of paths are filtered through the normal\nitinerary-filters.\n\n- The `ratio` must be greater or equal to 1.0 and less then 1.2.\n- The `constant` must be greater or equal to '0s' and less then '1h'.\n\nTHIS IS STILL AN EXPERIMENTAL FEATURE - IT MAY CHANGE WITHOUT ANY NOTICE!\n", + "name": "relaxTransitGroupPriority", + "type": { + "kind": "INPUT_OBJECT", + "name": "RelaxCostInput", + "ofType": null + } + }, { "defaultValue": "1.3", "description": "The maximum walk speed along streets, in meters per second.", @@ -6179,7 +6353,7 @@ }, { "defaultValue": "0", - "description": "The boardSlack is the minimum extra time to board a public transport vehicle. This is the same as the 'minimumTransferTime', except that this also apply to to the first transit leg in the trip. This is the default value used, if not overridden by the 'boardSlackList'.", + "description": "The boardSlack is the minimum extra time to board a public transport vehicle. This is the same as the 'minimumTransferTime', except that this also applies to to the first transit leg in the trip. This is the default value used, if not overridden by the 'boardSlackList'.", "name": "boardSlackDefault", "type": { "kind": "SCALAR", @@ -6255,26 +6429,6 @@ "ofType": null } }, - { - "defaultValue": "false", - "description": "Debug the itinerary-filter-chain. OTP will attach a system notice to itineraries instead of removing them. This is very convenient when tuning the filters.", - "name": "debugItineraryFilter", - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - } - }, - { - "defaultValue": "null", - "description": "Whether non-optimal transit paths at the destination should be returned. Let c be the\nexisting minimum pareto optimal generalized-cost to beat. Then a trip with cost c' is\naccepted if the following is true:\n\n`c' < Math.round(c * relaxTransitSearchGeneralizedCostAtDestination)`\n\nThe parameter is optional. If not set, a normal comparison is performed.\n\nValues less than 1.0 is not allowed, and values greater than 2.0 are not\nsupported, due to performance reasons.\n", - "name": "relaxTransitSearchGeneralizedCostAtDestination", - "type": { - "kind": "SCALAR", - "name": "Float", - "ofType": null - } - }, { "defaultValue": null, "description": "Configure the itinerary-filter-chain. NOTE! THESE PARAMETERS ARE USED FOR SERVER-SIDE TUNING AND IS AVAILABLE HERE FOR TESTING ONLY.", @@ -6286,7 +6440,25 @@ } }, { - "defaultValue": "[{streetMode : bike_rental, duration : \"PT20M\"}]", + "defaultValue": "[{streetMode : car_park, timePenalty : \"20m + 2.0 t\", costFactor : 1.5}, {streetMode : flexible, timePenalty : \"10m + 1.30 t\", costFactor : 1.3}]", + "description": "Time and cost penalty on access/egress modes.", + "name": "accessEgressPenalty", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PenaltyForStreetMode", + "ofType": null + } + } + } + }, + { + "defaultValue": "[{streetMode : bike_rental, duration : \"PT20M\"}, {streetMode : scooter_rental, duration : \"PT20M\"}]", "description": "Maximum duration for access/egress for street searches per respective mode. Cannot be higher than default value. This is a performance optimisation parameter, avoid using it to limit the search. ", "name": "maxAccessEgressDurationForMode", "type": { @@ -8104,6 +8276,37 @@ "name": "RelativeDirection", "possibleTypes": null }, + { + "description": "A relax-cost is used to increase the limit when comparing one cost to another cost.\nThis is used to include more results into the result. A `ratio=2.0` means a path(itinerary)\nwith twice as high cost as another one, is accepted. A `constant=$300` means a \"fixed\"\nconstant is added to the limit. A `{ratio=1.0, constant=0}` is said to be the NORMAL relaxed\ncost - the limit is the same as the cost used to calculate the limit. The NORMAL is usually\nthe default. We can express the RelaxCost as a function `f(t) = constant + ratio * t`.\n`f(t)=t` is the NORMAL function.\n", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": "1.0", + "description": "The factor to multiply with the 'other cost'. Minimum value is 1.0.", + "name": "ratio", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + { + "defaultValue": "\"0s\"", + "description": "The constant value to add to the limit. Must be a positive number. The value is equivalent to transit-cost-seconds. Integers are treated as seconds, but you may use the duration format. Example: '3665 = 'DT1h1m5s' = '1h1m5s'.", + "name": "constant", + "type": { + "kind": "SCALAR", + "name": "Cost", + "ofType": null + } + } + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "RelaxCostInput", + "possibleTypes": null + }, { "description": null, "enumValues": null, @@ -8397,7 +8600,7 @@ }, { "deprecationReason": null, - "description": "Transit connection was found, but it was outside the search window, see metadata for the next search window", + "description": "A transit connection was found, but it was outside the search window. Use paging to navigate to a result.", "isDeprecated": false, "name": "noTransitConnectionInSearchWindow" }, @@ -8457,9 +8660,9 @@ }, { "args": [], - "deprecationReason": null, + "deprecationReason": "This parameter is no longer configurable.", "description": "Max car speed along streets, in meters per second", - "isDeprecated": false, + "isDeprecated": true, "name": "carSpeed", "type": { "kind": "SCALAR", @@ -8770,7 +8973,7 @@ { "args": [], "deprecationReason": null, - "description": "The boardSlack is the minimum extra time to board a public transport vehicle. This is the same as the 'minimumTransferTime', except that this also apply to to the first transit leg in the trip. This is the default value used, if not overridden by the 'boardSlackList'.", + "description": "The boardSlack is the minimum extra time to board a public transport vehicle. This is the same as the 'minimumTransferTime', except that this also applies to to the first transit leg in the trip. This is the default value used, if not overridden by the 'boardSlackList'.", "isDeprecated": false, "name": "boardSlackDefault", "type": { @@ -8898,7 +9101,7 @@ { "args": [], "deprecationReason": null, - "description": "When true, realtime updates are ignored during this search.", + "description": "When true, real-time updates are ignored during this search.", "isDeprecated": false, "name": "ignoreRealTimeUpdates", "type": { @@ -9400,7 +9603,7 @@ { "args": [], "deprecationReason": null, - "description": "Returns scheduled passing times only - without realtime-updates, for realtime-data use 'estimatedCalls'", + "description": "Returns scheduled passing times only - without real-time-updates, for realtime-data use 'estimatedCalls'", "isDeprecated": false, "name": "passingTimes", "type": { @@ -9431,7 +9634,7 @@ } ], "deprecationReason": null, - "description": "Returns scheduled passingTimes for this ServiceJourney for a given date, updated with realtime-updates (if available). NB! This takes a date as argument (default=today) and returns estimatedCalls for that date and should only be used if the date is known when creating the request. For fetching estimatedCalls for a given trip.leg, use leg.serviceJourneyEstimatedCalls instead.", + "description": "Returns scheduled passingTimes for this ServiceJourney for a given date, updated with real-time-updates (if available). NB! This takes a date as argument (default=today) and returns estimatedCalls for that date and should only be used if the date is known when creating the request. For fetching estimatedCalls for a given trip.leg, use leg.serviceJourneyEstimatedCalls instead.", "isDeprecated": false, "name": "estimatedCalls", "type": { @@ -9623,6 +9826,41 @@ "name": "StopCondition", "possibleTypes": null }, + { + "description": null, + "enumValues": [ + { + "deprecationReason": null, + "description": "Preferred place to transfer, strongly recommended. NeTEx equivalent is PREFERRED_INTERCHANGE.", + "isDeprecated": false, + "name": "preferred" + }, + { + "deprecationReason": null, + "description": "Recommended stop place. NeTEx equivalent is RECOMMENDED_INTERCHANGE.", + "isDeprecated": false, + "name": "recommended" + }, + { + "deprecationReason": null, + "description": "Allow transfers from/to this stop. This is the default. NeTEx equivalent is INTERCHANGE_ALLOWED.", + "isDeprecated": false, + "name": "allowed" + }, + { + "deprecationReason": null, + "description": "Block transfers from/to this stop. In OTP this is not a definitive block, just a huge penalty is added to the cost function. NeTEx equivalent is NO_INTERCHANGE.", + "isDeprecated": false, + "name": "discouraged" + } + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "StopInterchangePriority", + "possibleTypes": null + }, { "description": "Named place where public transport may be accessed. May be a building complex (e.g. a station) or an on-street location.", "enumValues": null, @@ -9708,9 +9946,9 @@ }, { "args": [], - "deprecationReason": null, + "deprecationReason": "Not implemented. Use stopInterchangePriority", "description": "Relative weighting of this stop with regards to interchanges. NOT IMPLEMENTED", - "isDeprecated": false, + "isDeprecated": true, "name": "weighting", "type": { "kind": "ENUM", @@ -9718,6 +9956,18 @@ "ofType": null } }, + { + "args": [], + "deprecationReason": null, + "description": "Specify the priority of interchanges at this stop", + "isDeprecated": false, + "name": "stopInterchangePriority", + "type": { + "kind": "ENUM", + "name": "StopInterchangePriority", + "ofType": null + } + }, { "args": [], "deprecationReason": null, @@ -9835,7 +10085,7 @@ }, { "defaultValue": "86400", - "description": null, + "description": "Duration in seconds from start time to search forward for estimated calls. Must be a positive value. Default value is 24 hours", "name": "timeRange", "type": { "kind": "SCALAR", @@ -9899,7 +10149,7 @@ }, { "defaultValue": "false", - "description": "Indicates that realtime-cancelled trips should also be included.", + "description": "Indicates that real-time-cancelled trips should also be included.", "name": "includeCancelledTrips", "type": { "kind": "SCALAR", @@ -10288,6 +10538,53 @@ "name": "TimeAndDayOffset", "possibleTypes": null }, + { + "description": "The time-penalty is applied to either the access-legs and/or egress-legs. Both access and\negress may contain more than one leg; Hence, the penalty is not a field on leg.\n\nNote! This is for debugging only. This type can change without notice.\n", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "The time-penalty is applied to either the access-legs and/or egress-legs. Both access\nand egress may contain more than one leg; Hence, the penalty is not a field on leg. The\n`appliedTo` describe witch part of the itinerary that this instance applies to.\n", + "isDeprecated": false, + "name": "appliedTo", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The time-penalty added to the actual time/duration when comparing the itinerary with\nother itineraries. This is used to decide witch is the best option, but is not visible\n- the actual departure and arrival-times are not modified.\n", + "isDeprecated": false, + "name": "timePenalty", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + { + "args": [], + "deprecationReason": null, + "description": "The time-penalty does also propagate to the `generalizedCost`. As a result of the given\ntime-penalty, the generalized-cost also increased by the given amount. This delta is\nincluded in the itinerary generalized-cost. In some cases the generalized-cost-delta is\nexcluded when comparing itineraries - that happens if one of the itineraries is a\n\"direct/street-only\" itinerary. Time-penalty can not be set for direct searches, so it\nneeds to be excluded from such comparison to be fair. The unit is transit-seconds.\n", + "isDeprecated": false, + "name": "generalizedCostDelta", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "TimePenaltyWithCost", + "possibleTypes": null + }, { "description": "Scheduled passing times. These are not affected by real time updates.", "enumValues": null, @@ -11895,7 +12192,7 @@ { "args": [], "deprecationReason": null, - "description": "The expected, realtime adjusted date and time the trip starts.", + "description": "The expected, real-time adjusted date and time the trip starts.", "isDeprecated": false, "name": "expectedStartTime", "type": { @@ -11927,7 +12224,7 @@ { "args": [], "deprecationReason": null, - "description": "The expected, realtime adjusted date and time the trip ends.", + "description": "The expected, real-time adjusted date and time the trip ends.", "isDeprecated": false, "name": "expectedEndTime", "type": { @@ -12084,6 +12381,18 @@ "ofType": null } }, + { + "args": [], + "deprecationReason": null, + "description": "A second cost or weight of the itinerary. Some use-cases like pass-through and transit-priority-groups use a second cost during routing. This is used for debugging.", + "isDeprecated": false, + "name": "generalizedCost2", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, { "args": [], "deprecationReason": null, @@ -12107,6 +12416,30 @@ "name": "Int", "ofType": null } + }, + { + "args": [], + "deprecationReason": null, + "description": "A time and cost penalty applied to access and egress to favor regular scheduled\ntransit over potentially faster options with FLEX, Car, bike and scooter.\n\nNote! This field is meant for debugging only. The field can be removed without notice\nin the future.\n", + "isDeprecated": false, + "name": "timePenalty", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "TimePenaltyWithCost", + "ofType": null + } + } + } + } } ], "inputFields": null, @@ -12278,7 +12611,7 @@ "inputFields": [ { "defaultValue": null, - "description": "The name of the location. This is pass-through informationand is not used in routing.", + "description": "The name of the location. This is pass-through information and is not used in routing.", "name": "name", "type": { "kind": "SCALAR", @@ -13341,6 +13674,18 @@ "ofType": null } }, + { + "args": [], + "deprecationReason": null, + "description": "This field is considered experimental because it has not yet been ratified in the graphql specification", + "isDeprecated": false, + "name": "isOneOf", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, { "args": [], "deprecationReason": null, diff --git a/src/transportation/mod.rs b/src/transportation/mod.rs index 19e4bd1..07a4eca 100644 --- a/src/transportation/mod.rs +++ b/src/transportation/mod.rs @@ -1,23 +1,28 @@ -use reqwest; -use reqwest::header; -use graphql_client::{GraphQLQuery, Response}; use std::error::Error; use std::rc::Rc; use std::thread; -use chrono::DateTime as ChronoDateTime; -use slint::{ComponentHandle, SharedString, VecModel, Weak}; -use crate::transportation::stop_place::{ResponseData, StopPlaceStopPlace}; + +use chrono::{Local, TimeDelta, Utc}; +use graphql_client::{GraphQLQuery, Response}; +use reqwest; +use reqwest::header; +use slint::{ComponentHandle, Image, Rgba8Pixel, SharedPixelBuffer, SharedString, VecModel, Weak}; +use query::Variables; +use crate::StaticAssets; +use crate::transportation::query::{QueryStopPlace, QueryStopPlaceQuays, ResponseData, TransportMode}; use crate::ui::{MainWindow, StopPlaceData, StopPlaceDataRow}; const BASE_URL: &str = "https://api.entur.io/journey-planner/v3/graphql"; // https://developer.entur.org/pages-intro-authentication const ET_CLIENT: &str = "knowit-objectnet-trd-infoscreen"; -const HAAKON_VII_GATE: &str = "NSR:StopPlace:42310"; +const PRINSENS_GATE: &str = "NSR:StopPlace:41613"; +const PRINSENS_GATE_P1: &str = "NSR:Quay:71184"; +const PRINSENS_GATE_P2: &str = "NSR:Quay:71181"; const DEFAULT_TIME_RANGE: i64 = 72100; const DEFAULT_NUMBER_OF_DEPARTURES: i64 = 10; type Date = String; -type DateTime = String; +type DateTime = chrono::DateTime; #[derive(GraphQLQuery)] #[graphql( @@ -25,7 +30,7 @@ type DateTime = String; query_path = "src/resources/journey-planner_query.graphql", response_derives = "Debug" )] -struct StopPlace; +struct Query; pub fn setup(window: &MainWindow) { @@ -51,48 +56,78 @@ async fn transportation_worker_loop(window: Weak) { } } -fn display_transportation(window_weak: &Weak, stop_place: StopPlaceStopPlace) { +fn display_transportation(window_weak: &Weak, stop_place: QueryStopPlace) { window_weak .upgrade_in_event_loop(move |window: MainWindow| { - let transport_mode = stop_place - .estimated_calls.get(0).unwrap() - .service_journey.journey_pattern.as_ref().unwrap() - .line.transport_mode.as_ref().unwrap(); - - let public_code = stop_place - .estimated_calls.get(0).unwrap() - .service_journey.journey_pattern.as_ref().unwrap() - .line.public_code.as_ref().unwrap(); - - let destination_front_text = stop_place - .estimated_calls.get(0).unwrap() - .destination_display.as_ref().unwrap() - .front_text.as_ref().unwrap(); + let stop_place_data_rows: VecModel = VecModel::default(); - let aimed_departure_time = &stop_place - .estimated_calls.get(0).unwrap() - .aimed_departure_time; - - let custom_format = aimed_departure_time.as_str(); - //let custom_format_2 = aimed_departure_time.fmt(); + let quays: Vec = match stop_place.quays { + None => panic!("No quays for this stop."), + Some(quays) => quays.into_iter().map(|quay| match quay { + None => panic!("No data in Quay."), + Some(quay) => quay + }).collect() + }; - println!("{:#?}", destination_front_text); + let filtered_quays_option = quays + .into_iter() + .find(|quay| quay.id == PRINSENS_GATE_P1); - let stop_place_data_rows: VecModel = VecModel::default(); - - let stop_place_data_row = StopPlaceDataRow { - transportMode: SharedString::from("bus"), - publicCode: SharedString::from(public_code), - destinationFrontText: SharedString::from(destination_front_text), - aimedDepartureTime: SharedString::from(custom_format), + let quay = match filtered_quays_option { + None => panic!("No quay with this ID."), + Some(quay) => quay }; - stop_place_data_rows.push(stop_place_data_row); + for estimated_call in quay.estimated_calls { + + let transport_mode = match &estimated_call.service_journey.journey_pattern { + None => continue, + Some(journey_pattern) => { + match &journey_pattern.line.transport_mode { + None => continue, + Some(transport_mode) => { + transport_mode + } + } + } + }; + + + let public_code = estimated_call + .service_journey.journey_pattern.as_ref().unwrap() + .line.public_code.as_ref().unwrap(); + + let destination_front_text = estimated_call + .destination_display.as_ref().unwrap() + .front_text.as_ref().unwrap(); + + let aimed_departure_time = estimated_call + .aimed_departure_time; + + let Some(v) = format_departure_time(aimed_departure_time) else { continue }; + println!("v = {v}"); + + let custom_format = match format_departure_time(aimed_departure_time) { + None => continue, + Some(value) => value, + }; + + println!("{:#?}", destination_front_text); + + let stop_place_data_row = StopPlaceDataRow { + transportMode: get_icon(transport_mode.as_str()), + publicCode: SharedString::from(public_code), + destinationFrontText: SharedString::from(destination_front_text), + aimedDepartureTime: SharedString::from(custom_format), + }; + + stop_place_data_rows.push(stop_place_data_row); + } let stop_place_data = StopPlaceData { - stopName: SharedString::from(stop_place.name), + stopName: SharedString::from(format!("{} {}", quay.name, quay.public_code.unwrap_or(String::from("")))), stopDataRows: Rc::new(stop_place_data_rows).into() }; @@ -111,13 +146,13 @@ pub async fn get_stop_place() -> Result> { headers.insert("Accept", header::HeaderValue::from_static("application/json")); headers.insert("ET-Client-Name",header::HeaderValue::from_static(ET_CLIENT)); - let variables = stop_place::Variables { - id: HAAKON_VII_GATE.to_string(), + let variables = Variables { + id: PRINSENS_GATE.to_string(), time_range: Some(DEFAULT_TIME_RANGE), number_of_departures: Some(DEFAULT_NUMBER_OF_DEPARTURES), }; - let request_body = StopPlace::build_query(variables); + let request_body = Query::build_query(variables); let client = reqwest::Client::new(); @@ -132,3 +167,56 @@ pub async fn get_stop_place() -> Result> { Ok(response_body.data.expect("Missing response data")) } + +pub fn format_departure_time(departure_time: DateTime) -> Option { + let local_now = Local::now(); + let local_departure_time = departure_time.with_timezone(&Local); + + let time_delta = local_departure_time.signed_duration_since(local_now); + + return + if time_delta < TimeDelta::zero() { + None + } else if time_delta < TimeDelta::minutes(1) { + Some(String::from("Nå")) + } else if time_delta < TimeDelta::minutes(10) { + Some(format!("{} min", time_delta.num_minutes())) + } else { + Some(format!("{}", local_departure_time.format("%H:%M"))) + } +} + +fn get_icon(icon_name: &str) -> Image { + let icon_path = std::format!("transport/{}.png", icon_name); + let icon_data = match StaticAssets::get(&icon_path) { + Some(icon_data) => icon_data.data.into_owned(), + None => StaticAssets::get("not-found.png") + .unwrap() + .data + .into_owned(), + }; + + let transport_icon = image::load_from_memory_with_format(&icon_data, image::ImageFormat::Png) + .unwrap() + .into_rgba8(); + + let buffer = SharedPixelBuffer::::clone_from_slice( + transport_icon.as_raw(), + transport_icon.width(), + transport_icon.height(), + ); + + Image::from_rgba8(buffer) +} + + +impl TransportMode { + fn as_str(&self) -> &'static str { + match self { + TransportMode::bus => "bus", + TransportMode::tram => "tram", + TransportMode::rail => "rail", + _ => "unknown" + } + } +} \ No newline at end of file diff --git a/ui/mainwindow.slint b/ui/mainwindow.slint index 9241257..1e264ac 100644 --- a/ui/mainwindow.slint +++ b/ui/mainwindow.slint @@ -42,7 +42,7 @@ export component MainWindow inherits Window { in property <[StopPlaceData]> stopPlacesData: [{ stopName: "Placeholder", stopDataRows: [{ - transportMode: "Spark", + transportMode: @image-url("../img/transport/walk.png"), publicCode: 0, destinationFrontText: "Månen", aimedDepartureTime: "Nå", diff --git a/ui/transportation.slint b/ui/transportation.slint index e571c62..990ef20 100644 --- a/ui/transportation.slint +++ b/ui/transportation.slint @@ -1,5 +1,5 @@ export struct StopPlaceDataRow { - transportMode: string, + transportMode: image, publicCode: string, destinationFrontText: string, aimedDepartureTime: string, @@ -15,11 +15,11 @@ component StopPlaceRow { HorizontalLayout { spacing: 1.5rem; - alignment: center; - Text { - font-size: 3rem; - text: stopPlaceDataRow.transportMode; - color: whitesmoke; + alignment: start; + Image { + max-height: 8.75rem; + max-width: 8.75rem; + source: stopPlaceDataRow.transportMode; } Text { font-size: 3rem; From b004a3c7282f1e51668c49e5b0dbf5d04a6c39a5 Mon Sep 17 00:00:00 2001 From: andpas Date: Mon, 5 Aug 2024 18:05:48 +0200 Subject: [PATCH 05/11] Everything but the Slint components in place for multiple StopPlaces and Quays. --- .gitignore | 6 +- .../journey-planner_query.graphql | 0 .../journey-planner_schema.json | 0 src/transportation/mod.rs | 245 ++++++++++++------ src/transportation/trackedStops.json | 20 ++ src/transportation/transportation_models.rs | 20 ++ 6 files changed, 204 insertions(+), 87 deletions(-) rename src/{resources => transportation}/journey-planner_query.graphql (100%) rename src/{resources => transportation}/journey-planner_schema.json (100%) create mode 100644 src/transportation/trackedStops.json create mode 100644 src/transportation/transportation_models.rs diff --git a/.gitignore b/.gitignore index c9435fa..1b7cf5a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,8 @@ .LSOverride # Icon must end with two \r -Icon +Icon + # Thumbnails ._* @@ -241,3 +242,6 @@ Cargo.lock # End of https://www.toptal.com/developers/gitignore/api/macos,visualstudiocode,python,rust +# Jetbrains IDEs +.idea + diff --git a/src/resources/journey-planner_query.graphql b/src/transportation/journey-planner_query.graphql similarity index 100% rename from src/resources/journey-planner_query.graphql rename to src/transportation/journey-planner_query.graphql diff --git a/src/resources/journey-planner_schema.json b/src/transportation/journey-planner_schema.json similarity index 100% rename from src/resources/journey-planner_schema.json rename to src/transportation/journey-planner_schema.json diff --git a/src/transportation/mod.rs b/src/transportation/mod.rs index 07a4eca..d924ebd 100644 --- a/src/transportation/mod.rs +++ b/src/transportation/mod.rs @@ -1,15 +1,22 @@ +mod transportation_models; + use std::error::Error; +use std::fs::File; +use std::io::BufReader; use std::rc::Rc; use std::thread; use chrono::{Local, TimeDelta, Utc}; use graphql_client::{GraphQLQuery, Response}; +use log::info; +use log::kv::Source; use reqwest; use reqwest::header; use slint::{ComponentHandle, Image, Rgba8Pixel, SharedPixelBuffer, SharedString, VecModel, Weak}; use query::Variables; use crate::StaticAssets; -use crate::transportation::query::{QueryStopPlace, QueryStopPlaceQuays, ResponseData, TransportMode}; +use crate::transportation::query::{QueryStopPlace, QueryStopPlaceQuays, QueryStopPlaceQuaysEstimatedCalls, ResponseData, TransportMode}; +use crate::transportation::transportation_models::{TrackedQuay, TrackedStop, TrackedStops}; use crate::ui::{MainWindow, StopPlaceData, StopPlaceDataRow}; const BASE_URL: &str = "https://api.entur.io/journey-planner/v3/graphql"; @@ -26,13 +33,12 @@ type DateTime = chrono::DateTime; #[derive(GraphQLQuery)] #[graphql( - schema_path = "src/resources/journey-planner_schema.json", - query_path = "src/resources/journey-planner_query.graphql", - response_derives = "Debug" + schema_path = "src/transportation/journey-planner_schema.json", + query_path = "src/transportation/journey-planner_query.graphql", + response_derives = "Debug, Clone" )] struct Query; - pub fn setup(window: &MainWindow) { let window_weak = window.as_weak(); thread::spawn(move || { @@ -44,110 +50,177 @@ pub fn setup(window: &MainWindow) { async fn transportation_worker_loop(window: Weak) { loop { - let result = get_stop_place().await; - if result.is_ok() { - let option_stop_place = result.unwrap().stop_place; - if option_stop_place.is_some() { - let stop_place = option_stop_place.unwrap(); - display_transportation(&window, stop_place) + match read_tracked_stops() { + Ok(tracked_stops) => { + let all_stops_data: VecModel = VecModel::default(); + + for tracked_stop in tracked_stops.stops { + // 1. Run GraphQL Query + let result = get_stop_place(tracked_stop.clone()).await; + let stop_place = match result { + Ok(response) => match response.stop_place { + Some(stop_place) => stop_place, + None => { + info!("No stop places returned from server. Check if the StopPlace-ID exists."); + continue + } + } + Err(_) => { + info!("Error from server. Check query."); + continue + } + }; + + // 2. Filter on tracked quays and lines + let filtered_quays = match filter_by_quays_and_lines(stop_place, tracked_stop) { + None => { + info!("No quays left after filtering. Check if Quay-IDs exist on this StopPlace."); + continue + }, + Some(filtered_quays) => filtered_quays + }; + + // 3. Construct StopPlaceData and place in Vec + for quay in filtered_quays { + let stop_place_data_rows: VecModel = VecModel::default(); + + for estimated_call in quay.estimated_calls { + match extract_relevant_values(estimated_call) { + None => { + info!("Unable to extract values from estimated call. Skipping."); + continue + } + Some(row) => stop_place_data_rows.push(row) + }; + } + + let stop_place_data = StopPlaceData { + stopName: SharedString::from(format!("{} {}", quay.name, quay.public_code.unwrap_or(String::from("")))), + stopDataRows: Rc::new(stop_place_data_rows).into() + }; + + all_stops_data.push(stop_place_data); + } + } + + // Display Vec of StopPlaceData + display_transportation(&window, all_stops_data); + } + Err(_) => { + info! { "Unable to read file containing tracked stops information." } } - } + }; + tokio::time::sleep(std::time::Duration::from_secs(60 * 60)).await; } } -fn display_transportation(window_weak: &Weak, stop_place: QueryStopPlace) { - +fn display_transportation(window_weak: &Weak, all_stops_data: VecModel) { + /* window_weak .upgrade_in_event_loop(move |window: MainWindow| { + window.set_stopPlacesData(Rc::new(all_stops_data).into()) + }) + .unwrap(); + */ +} - let stop_place_data_rows: VecModel = VecModel::default(); - - let quays: Vec = match stop_place.quays { - None => panic!("No quays for this stop."), - Some(quays) => quays.into_iter().map(|quay| match quay { - None => panic!("No data in Quay."), - Some(quay) => quay - }).collect() - }; - - let filtered_quays_option = quays - .into_iter() - .find(|quay| quay.id == PRINSENS_GATE_P1); - - let quay = match filtered_quays_option { - None => panic!("No quay with this ID."), - Some(quay) => quay - }; - - for estimated_call in quay.estimated_calls { - - let transport_mode = match &estimated_call.service_journey.journey_pattern { - None => continue, - Some(journey_pattern) => { - match &journey_pattern.line.transport_mode { - None => continue, - Some(transport_mode) => { - transport_mode - } - } - } - }; - - - let public_code = estimated_call - .service_journey.journey_pattern.as_ref().unwrap() - .line.public_code.as_ref().unwrap(); - - let destination_front_text = estimated_call - .destination_display.as_ref().unwrap() - .front_text.as_ref().unwrap(); +fn read_tracked_stops() -> Result> { + // Open the file in read-only mode with buffer. + let file = File::open("src/transportation/trackedStops.json")?; + let reader = BufReader::new(file); - let aimed_departure_time = estimated_call - .aimed_departure_time; + // Read the JSON contents of the file as an instance of `User`. + let tracked_stops = serde_json::from_reader(reader)?; - let Some(v) = format_departure_time(aimed_departure_time) else { continue }; - println!("v = {v}"); - - let custom_format = match format_departure_time(aimed_departure_time) { - None => continue, - Some(value) => value, - }; + // Return the object. + Ok(tracked_stops) +} - println!("{:#?}", destination_front_text); +fn filter_by_quays_and_lines(query_stop_place: QueryStopPlace, tracked_stop: TrackedStop) -> Option> { + let all_query_quays: Vec<&QueryStopPlaceQuays> = match query_stop_place.quays { + None => { + info!("No quays for stop with ID {}", query_stop_place.id); + return None + }, + Some(quays) => quays.iter().flatten().collect::>() + }; + + let tracked_quays: Vec<&TrackedQuay> = tracked_stop.quays.iter().flatten().collect(); + let mut picked_query_quays: Vec = Vec::new(); + + for tracked_quay in tracked_quays { + for query_quay in all_query_quays { + if tracked_quay.id == query_quay.id { + picked_query_quays.push(query_quay.clone()) + } + } + } + + // TODO: + // - Implement filtering by specific lines per quay - let stop_place_data_row = StopPlaceDataRow { - transportMode: get_icon(transport_mode.as_str()), - publicCode: SharedString::from(public_code), - destinationFrontText: SharedString::from(destination_front_text), - aimedDepartureTime: SharedString::from(custom_format), - }; + return Some(picked_query_quays) +} - stop_place_data_rows.push(stop_place_data_row); +fn extract_relevant_values(estimated_call: QueryStopPlaceQuaysEstimatedCalls) -> Option { + let transport_mode = match &estimated_call.service_journey.journey_pattern { + None => { + info!("No journey pattern found for service journey '{}'", estimated_call.service_journey.public_code.unwrap_or(String::from("unknown"))); + return None; + }, + Some(journey_pattern) => { + match &journey_pattern.line.transport_mode { + None => { + info!("No transport mode found for line '{}'", journey_pattern.line.id); + return None + }, + Some(transport_mode) => { + transport_mode + } } - - let stop_place_data = StopPlaceData { - stopName: SharedString::from(format!("{} {}", quay.name, quay.public_code.unwrap_or(String::from("")))), - stopDataRows: Rc::new(stop_place_data_rows).into() - }; + } + }; - let all_stops_data: VecModel = VecModel::default(); + // TODO: + // - More error handling and less unwrapping. + + let public_code = estimated_call + .service_journey.journey_pattern.as_ref().unwrap() + .line.public_code.as_ref().unwrap(); + + let destination_front_text = estimated_call + .destination_display.as_ref().unwrap() + .front_text.as_ref().unwrap(); + + let aimed_departure_time = estimated_call.aimed_departure_time; + + let custom_format = match format_departure_time(aimed_departure_time) { + None => { + info!("Unable to format departure time: {}", aimed_departure_time.to_string()); + return None + }, + Some(value) => value, + }; - all_stops_data.push(stop_place_data); - - window.set_stopPlacesData(Rc::new(all_stops_data).into()) - }) - .unwrap(); + let stop_place_data_row = StopPlaceDataRow { + transportMode: get_icon(transport_mode.as_str()), + publicCode: SharedString::from(public_code), + destinationFrontText: SharedString::from(destination_front_text), + aimedDepartureTime: SharedString::from(custom_format), + }; + + return Some(stop_place_data_row) } -pub async fn get_stop_place() -> Result> { +async fn get_stop_place(tracked_stop: TrackedStop) -> Result> { let mut headers = header::HeaderMap::new(); headers.insert("Accept", header::HeaderValue::from_static("application/json")); headers.insert("ET-Client-Name",header::HeaderValue::from_static(ET_CLIENT)); let variables = Variables { - id: PRINSENS_GATE.to_string(), + id: tracked_stop.id, time_range: Some(DEFAULT_TIME_RANGE), number_of_departures: Some(DEFAULT_NUMBER_OF_DEPARTURES), }; @@ -168,7 +241,7 @@ pub async fn get_stop_place() -> Result> { Ok(response_body.data.expect("Missing response data")) } -pub fn format_departure_time(departure_time: DateTime) -> Option { +fn format_departure_time(departure_time: DateTime) -> Option { let local_now = Local::now(); let local_departure_time = departure_time.with_timezone(&Local); diff --git a/src/transportation/trackedStops.json b/src/transportation/trackedStops.json new file mode 100644 index 0000000..8793257 --- /dev/null +++ b/src/transportation/trackedStops.json @@ -0,0 +1,20 @@ +{ + "stops": [ + { + "id": "NSR:StopPlace:41613", + "name": "Prinsens gate", + "quays": [ + { + "id": "NSR:Quay:71184", + "name": "Prinsens gate P1", + "lines": [] + }, + { + "id": "NSR:Quay:71181", + "name": "Prinsens gate P2", + "lines": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/transportation/transportation_models.rs b/src/transportation/transportation_models.rs new file mode 100644 index 0000000..942aadc --- /dev/null +++ b/src/transportation/transportation_models.rs @@ -0,0 +1,20 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct TrackedQuay { + pub id: String, + pub name: String, + pub lines: Option>, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct TrackedStop { + pub id: String, + pub name: String, + pub quays: Option> +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct TrackedStops { + pub stops: Vec +} \ No newline at end of file From 6ae615fd31f283dda8dd4793385bfef7ec89475a Mon Sep 17 00:00:00 2001 From: andpas Date: Tue, 6 Aug 2024 22:50:44 +0200 Subject: [PATCH 06/11] Working bus tables filtered by quays. --- .../journey-planner_query.graphql | 4 +- src/transportation/mod.rs | 113 +++++++++--------- ui/mainwindow.slint | 2 +- ui/transportation.slint | 89 +++++++++----- 4 files changed, 114 insertions(+), 94 deletions(-) diff --git a/src/transportation/journey-planner_query.graphql b/src/transportation/journey-planner_query.graphql index 2b3d3b2..283e478 100644 --- a/src/transportation/journey-planner_query.graphql +++ b/src/transportation/journey-planner_query.graphql @@ -1,4 +1,4 @@ -query Query($id: String!, $timeRange: Int, $numberOfDepartures: Int) { +query Query($id: String!, $numberOfDepartures: Int) { stopPlace(id: $id) { id name @@ -6,7 +6,7 @@ query Query($id: String!, $timeRange: Int, $numberOfDepartures: Int) { id name publicCode - estimatedCalls(timeRange: $timeRange, numberOfDepartures: $numberOfDepartures) { + estimatedCalls(numberOfDepartures: $numberOfDepartures) { realtime aimedArrivalTime aimedDepartureTime diff --git a/src/transportation/mod.rs b/src/transportation/mod.rs index d924ebd..b090746 100644 --- a/src/transportation/mod.rs +++ b/src/transportation/mod.rs @@ -8,8 +8,6 @@ use std::thread; use chrono::{Local, TimeDelta, Utc}; use graphql_client::{GraphQLQuery, Response}; -use log::info; -use log::kv::Source; use reqwest; use reqwest::header; use slint::{ComponentHandle, Image, Rgba8Pixel, SharedPixelBuffer, SharedString, VecModel, Weak}; @@ -22,11 +20,7 @@ use crate::ui::{MainWindow, StopPlaceData, StopPlaceDataRow}; const BASE_URL: &str = "https://api.entur.io/journey-planner/v3/graphql"; // https://developer.entur.org/pages-intro-authentication const ET_CLIENT: &str = "knowit-objectnet-trd-infoscreen"; -const PRINSENS_GATE: &str = "NSR:StopPlace:41613"; -const PRINSENS_GATE_P1: &str = "NSR:Quay:71184"; -const PRINSENS_GATE_P2: &str = "NSR:Quay:71181"; -const DEFAULT_TIME_RANGE: i64 = 72100; -const DEFAULT_NUMBER_OF_DEPARTURES: i64 = 10; +const DEFAULT_NUMBER_OF_DEPARTURES: i64 = 8; type Date = String; type DateTime = chrono::DateTime; @@ -52,62 +46,41 @@ async fn transportation_worker_loop(window: Weak) { loop { match read_tracked_stops() { Ok(tracked_stops) => { - let all_stops_data: VecModel = VecModel::default(); - + let mut all_filtered_quays: Vec = Vec::new(); + for tracked_stop in tracked_stops.stops { - // 1. Run GraphQL Query + // Run GraphQL Query let result = get_stop_place(tracked_stop.clone()).await; let stop_place = match result { Ok(response) => match response.stop_place { Some(stop_place) => stop_place, None => { - info!("No stop places returned from server. Check if the StopPlace-ID exists."); + println!("No stop places returned from server. Check if the StopPlace-ID exists."); continue } } Err(_) => { - info!("Error from server. Check query."); + println!("Error from server. Check query."); continue } }; - - // 2. Filter on tracked quays and lines + + // Filter on tracked quays and lines let filtered_quays = match filter_by_quays_and_lines(stop_place, tracked_stop) { None => { - info!("No quays left after filtering. Check if Quay-IDs exist on this StopPlace."); + println!("No quays left after filtering. Check if Quay-IDs exist on this StopPlace."); continue }, Some(filtered_quays) => filtered_quays }; - - // 3. Construct StopPlaceData and place in Vec - for quay in filtered_quays { - let stop_place_data_rows: VecModel = VecModel::default(); - - for estimated_call in quay.estimated_calls { - match extract_relevant_values(estimated_call) { - None => { - info!("Unable to extract values from estimated call. Skipping."); - continue - } - Some(row) => stop_place_data_rows.push(row) - }; - } - - let stop_place_data = StopPlaceData { - stopName: SharedString::from(format!("{} {}", quay.name, quay.public_code.unwrap_or(String::from("")))), - stopDataRows: Rc::new(stop_place_data_rows).into() - }; - all_stops_data.push(stop_place_data); - } + all_filtered_quays.extend(filtered_quays); } - - // Display Vec of StopPlaceData - display_transportation(&window, all_stops_data); + + display_transportation(&window, all_filtered_quays); } Err(_) => { - info! { "Unable to read file containing tracked stops information." } + println! { "Unable to read file containing tracked stops information." } } }; @@ -115,14 +88,38 @@ async fn transportation_worker_loop(window: Weak) { } } -fn display_transportation(window_weak: &Weak, all_stops_data: VecModel) { - /* - window_weak - .upgrade_in_event_loop(move |window: MainWindow| { - window.set_stopPlacesData(Rc::new(all_stops_data).into()) - }) - .unwrap(); - */ +fn display_transportation(window: &Weak, filtered_quays: Vec) { + let _ = window.upgrade_in_event_loop(|window: MainWindow| { + + let all_stops_data: VecModel = VecModel::default(); + + for quay in filtered_quays { + let quay_name = quay.name; + let quay_public_code = quay.public_code.unwrap_or(String::from("")); + + println!("Processing quay {} {}", quay_name, quay_public_code); + let stop_place_data_rows: VecModel = VecModel::default(); + + for estimated_call in quay.estimated_calls { + match extract_relevant_values(estimated_call) { + None => { + println!("Unable to extract values from estimated call. Skipping."); + continue + } + Some(row) => stop_place_data_rows.push(row) + }; + } + + let stop_place_data = StopPlaceData { + stopName: SharedString::from(format!("{} {}", quay_name, quay_public_code)), + stopDataRows: Rc::new(stop_place_data_rows).into() + }; + + all_stops_data.push(stop_place_data); + } + + window.set_stopPlacesData(Rc::new(all_stops_data).into()); + }); } fn read_tracked_stops() -> Result> { @@ -138,21 +135,21 @@ fn read_tracked_stops() -> Result> { } fn filter_by_quays_and_lines(query_stop_place: QueryStopPlace, tracked_stop: TrackedStop) -> Option> { - let all_query_quays: Vec<&QueryStopPlaceQuays> = match query_stop_place.quays { + let all_query_quays: Vec = match query_stop_place.quays { None => { - info!("No quays for stop with ID {}", query_stop_place.id); + println!("No quays for stop with ID {}", query_stop_place.id); return None }, - Some(quays) => quays.iter().flatten().collect::>() + Some(quays) => quays.into_iter().flatten().collect::>() }; - let tracked_quays: Vec<&TrackedQuay> = tracked_stop.quays.iter().flatten().collect(); + let tracked_quays: Vec = tracked_stop.quays.into_iter().flatten().collect(); let mut picked_query_quays: Vec = Vec::new(); for tracked_quay in tracked_quays { - for query_quay in all_query_quays { + for query_quay in all_query_quays.clone() { if tracked_quay.id == query_quay.id { - picked_query_quays.push(query_quay.clone()) + picked_query_quays.push(query_quay) } } } @@ -166,13 +163,13 @@ fn filter_by_quays_and_lines(query_stop_place: QueryStopPlace, tracked_stop: Tra fn extract_relevant_values(estimated_call: QueryStopPlaceQuaysEstimatedCalls) -> Option { let transport_mode = match &estimated_call.service_journey.journey_pattern { None => { - info!("No journey pattern found for service journey '{}'", estimated_call.service_journey.public_code.unwrap_or(String::from("unknown"))); + println!("No journey pattern found for service journey '{}'", estimated_call.service_journey.public_code.unwrap_or(String::from("unknown"))); return None; }, Some(journey_pattern) => { match &journey_pattern.line.transport_mode { None => { - info!("No transport mode found for line '{}'", journey_pattern.line.id); + println!("No transport mode found for line '{}'", journey_pattern.line.id); return None }, Some(transport_mode) => { @@ -197,7 +194,7 @@ fn extract_relevant_values(estimated_call: QueryStopPlaceQuaysEstimatedCalls) -> let custom_format = match format_departure_time(aimed_departure_time) { None => { - info!("Unable to format departure time: {}", aimed_departure_time.to_string()); + println!("Unable to format departure time: {}", aimed_departure_time.to_string()); return None }, Some(value) => value, @@ -221,7 +218,6 @@ async fn get_stop_place(tracked_stop: TrackedStop) -> Result Option { return if time_delta < TimeDelta::zero() { + println!("Departure time in the past."); None } else if time_delta < TimeDelta::minutes(1) { Some(String::from("Nå")) diff --git a/ui/mainwindow.slint b/ui/mainwindow.slint index 1e264ac..34d99cc 100644 --- a/ui/mainwindow.slint +++ b/ui/mainwindow.slint @@ -51,7 +51,7 @@ export component MainWindow inherits Window { title: "Infoskjerm"; //TODO: Set programmatically? - no-frame: true; + //no-frame: true; //width: 1080px; height: 1900px; background: #0C0C27; diff --git a/ui/transportation.slint b/ui/transportation.slint index 990ef20..cda8aed 100644 --- a/ui/transportation.slint +++ b/ui/transportation.slint @@ -1,3 +1,5 @@ +import { Divider } from "utils.slint"; +import { StandardTableView } from "std-widgets.slint"; export struct StopPlaceDataRow { transportMode: image, publicCode: string, @@ -10,50 +12,60 @@ export struct StopPlaceData { stopDataRows: [StopPlaceDataRow] } -component StopPlaceRow { +component DisplayRow { in property stopPlaceDataRow; - HorizontalLayout { - spacing: 1.5rem; - alignment: start; - Image { - max-height: 8.75rem; - max-width: 8.75rem; - source: stopPlaceDataRow.transportMode; - } - Text { - font-size: 3rem; - text: stopPlaceDataRow.publicCode; - color: whitesmoke; - } - Text { - font-size: 3rem; - text: stopPlaceDataRow.destinationFrontText; - color: whitesmoke; - } - Text { - font-size: 3rem; - text: stopPlaceDataRow.aimedDepartureTime; - color: yellow; - } + VerticalLayout { + + HorizontalLayout { + alignment: start; + padding-top: 0.5rem; + + Image { + height: 1.5rem; + width: 7.5%; + source: stopPlaceDataRow.transportMode; + } + Text { + font-size: 1.5rem; + width: 7.5%; + text: stopPlaceDataRow.publicCode; + color: whitesmoke; + } + Text { + font-size: 1.5rem; + width: 65%; + text: stopPlaceDataRow.destinationFrontText; + color: whitesmoke; + } + Text { + font-size: 1.5rem; + width: 20%; + text: stopPlaceDataRow.aimedDepartureTime; + color: whitesmoke; + } + } + + Divider {} } } -component StopPlaceColumn { +component DisplayColumn { in property stopPlaceData; VerticalLayout { - alignment: start; - padding-top: 2rem; Text { color: whitesmoke; - font-size: 4rem; + font-size: 2rem; text: stopPlaceData.stopName; - horizontal-alignment: center; + horizontal-alignment: left; + padding-bottom: 1rem; } - for stopPlaceRow in stopPlaceData.stopDataRows : StopPlaceRow { + Divider {} + + for stopPlaceRow in stopPlaceData.stopDataRows : DisplayRow { stopPlaceDataRow: stopPlaceRow; } } @@ -62,9 +74,20 @@ component StopPlaceColumn { export component TransportationWidget{ in property <[StopPlaceData]> stopPlacesData; - HorizontalLayout { - for stopPlace in stopPlacesData : StopPlaceColumn { - stopPlaceData: stopPlace; + VerticalLayout { + Text { + color: whitesmoke; + font-size: 3rem; + text: "Busstider"; + horizontal-alignment: left; + } + + HorizontalLayout { + padding-top: 1rem; + + for stopPlace in stopPlacesData : DisplayColumn { + stopPlaceData: stopPlace; + } } } } \ No newline at end of file From 5b8f1067d47c6d65e0896eeb1c1df7d785a6fe20 Mon Sep 17 00:00:00 2001 From: andpas Date: Wed, 7 Aug 2024 13:39:48 +0200 Subject: [PATCH 07/11] * Slint formatting. * Use realtime for colored timestamps. * Set polling to 1 minute. * Set correct logging levels. --- src/transportation/mod.rs | 37 ++++++++++++++++++++++--------------- ui/mainwindow.slint | 3 ++- ui/transportation.slint | 31 ++++++++++++++++--------------- 3 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/transportation/mod.rs b/src/transportation/mod.rs index b090746..3dd1813 100644 --- a/src/transportation/mod.rs +++ b/src/transportation/mod.rs @@ -8,6 +8,7 @@ use std::thread; use chrono::{Local, TimeDelta, Utc}; use graphql_client::{GraphQLQuery, Response}; +use log::{debug, info}; use reqwest; use reqwest::header; use slint::{ComponentHandle, Image, Rgba8Pixel, SharedPixelBuffer, SharedString, VecModel, Weak}; @@ -21,6 +22,7 @@ const BASE_URL: &str = "https://api.entur.io/journey-planner/v3/graphql"; // https://developer.entur.org/pages-intro-authentication const ET_CLIENT: &str = "knowit-objectnet-trd-infoscreen"; const DEFAULT_NUMBER_OF_DEPARTURES: i64 = 8; +const POLLING_TIME: u64 = 60; // In seconds type Date = String; type DateTime = chrono::DateTime; @@ -55,12 +57,12 @@ async fn transportation_worker_loop(window: Weak) { Ok(response) => match response.stop_place { Some(stop_place) => stop_place, None => { - println!("No stop places returned from server. Check if the StopPlace-ID exists."); + info!("No stop places returned from server. Check if the StopPlace-ID exists."); continue } } Err(_) => { - println!("Error from server. Check query."); + info!("Error from server. Check query."); continue } }; @@ -68,7 +70,7 @@ async fn transportation_worker_loop(window: Weak) { // Filter on tracked quays and lines let filtered_quays = match filter_by_quays_and_lines(stop_place, tracked_stop) { None => { - println!("No quays left after filtering. Check if Quay-IDs exist on this StopPlace."); + info!("No quays left after filtering. Check if Quay-IDs exist on this StopPlace."); continue }, Some(filtered_quays) => filtered_quays @@ -80,11 +82,11 @@ async fn transportation_worker_loop(window: Weak) { display_transportation(&window, all_filtered_quays); } Err(_) => { - println! { "Unable to read file containing tracked stops information." } + info! { "Unable to read file containing tracked stops information." } } }; - tokio::time::sleep(std::time::Duration::from_secs(60 * 60)).await; + tokio::time::sleep(std::time::Duration::from_secs(POLLING_TIME)).await; } } @@ -97,13 +99,13 @@ fn display_transportation(window: &Weak, filtered_quays: Vec = VecModel::default(); for estimated_call in quay.estimated_calls { match extract_relevant_values(estimated_call) { None => { - println!("Unable to extract values from estimated call. Skipping."); + info!("Unable to extract values from estimated call. Skipping."); continue } Some(row) => stop_place_data_rows.push(row) @@ -137,7 +139,7 @@ fn read_tracked_stops() -> Result> { fn filter_by_quays_and_lines(query_stop_place: QueryStopPlace, tracked_stop: TrackedStop) -> Option> { let all_query_quays: Vec = match query_stop_place.quays { None => { - println!("No quays for stop with ID {}", query_stop_place.id); + info!("No quays for stop with ID {}", query_stop_place.id); return None }, Some(quays) => quays.into_iter().flatten().collect::>() @@ -163,13 +165,13 @@ fn filter_by_quays_and_lines(query_stop_place: QueryStopPlace, tracked_stop: Tra fn extract_relevant_values(estimated_call: QueryStopPlaceQuaysEstimatedCalls) -> Option { let transport_mode = match &estimated_call.service_journey.journey_pattern { None => { - println!("No journey pattern found for service journey '{}'", estimated_call.service_journey.public_code.unwrap_or(String::from("unknown"))); + info!("No journey pattern found for service journey '{}'", estimated_call.service_journey.public_code.unwrap_or(String::from("unknown"))); return None; }, Some(journey_pattern) => { match &journey_pattern.line.transport_mode { None => { - println!("No transport mode found for line '{}'", journey_pattern.line.id); + info!("No transport mode found for line '{}'", journey_pattern.line.id); return None }, Some(transport_mode) => { @@ -191,20 +193,25 @@ fn extract_relevant_values(estimated_call: QueryStopPlaceQuaysEstimatedCalls) -> .front_text.as_ref().unwrap(); let aimed_departure_time = estimated_call.aimed_departure_time; + + let expected_departure_time = estimated_call.expected_departure_time; - let custom_format = match format_departure_time(aimed_departure_time) { + let departure_time_formatted = match format_departure_time(expected_departure_time) { None => { - println!("Unable to format departure time: {}", aimed_departure_time.to_string()); + info!("Unable to format departure time: {}", aimed_departure_time.to_string()); return None }, Some(value) => value, }; + + let realtime = estimated_call.realtime; let stop_place_data_row = StopPlaceDataRow { transportMode: get_icon(transport_mode.as_str()), publicCode: SharedString::from(public_code), destinationFrontText: SharedString::from(destination_front_text), - aimedDepartureTime: SharedString::from(custom_format), + departureTime: SharedString::from(departure_time_formatted), + realtime: realtime, }; return Some(stop_place_data_row) @@ -232,7 +239,7 @@ async fn get_stop_place(tracked_stop: TrackedStop) -> Result = res.json().await?; - println!("{:#?}", response_body); + debug!("{:#?}", response_body); Ok(response_body.data.expect("Missing response data")) } @@ -245,7 +252,7 @@ fn format_departure_time(departure_time: DateTime) -> Option { return if time_delta < TimeDelta::zero() { - println!("Departure time in the past."); + info!("Data error: Expected departure time is in the past."); None } else if time_delta < TimeDelta::minutes(1) { Some(String::from("Nå")) diff --git a/ui/mainwindow.slint b/ui/mainwindow.slint index 34d99cc..b204efd 100644 --- a/ui/mainwindow.slint +++ b/ui/mainwindow.slint @@ -45,7 +45,8 @@ export component MainWindow inherits Window { transportMode: @image-url("../img/transport/walk.png"), publicCode: 0, destinationFrontText: "Månen", - aimedDepartureTime: "Nå", + departureTime: "Nå", + realtime: false, }] }]; diff --git a/ui/transportation.slint b/ui/transportation.slint index cda8aed..1613aa4 100644 --- a/ui/transportation.slint +++ b/ui/transportation.slint @@ -4,7 +4,8 @@ export struct StopPlaceDataRow { transportMode: image, publicCode: string, destinationFrontText: string, - aimedDepartureTime: string, + departureTime: string, + realtime: bool, } export struct StopPlaceData { @@ -16,33 +17,33 @@ component DisplayRow { in property stopPlaceDataRow; VerticalLayout { + spacing: 1rem; HorizontalLayout { alignment: start; - padding-top: 0.5rem; Image { - height: 1.5rem; + height: 1.75rem; width: 7.5%; source: stopPlaceDataRow.transportMode; } Text { - font-size: 1.5rem; + font-size: 1.75rem; width: 7.5%; text: stopPlaceDataRow.publicCode; color: whitesmoke; } Text { - font-size: 1.5rem; - width: 65%; + font-size: 1.75rem; + width: 70%; text: stopPlaceDataRow.destinationFrontText; color: whitesmoke; } Text { - font-size: 1.5rem; - width: 20%; - text: stopPlaceDataRow.aimedDepartureTime; - color: whitesmoke; + font-size: 1.75rem; + width: 15%; + text: stopPlaceDataRow.departureTime; + color: stopPlaceDataRow.realtime ? yellow : whitesmoke; } } @@ -54,13 +55,13 @@ component DisplayColumn { in property stopPlaceData; VerticalLayout { + spacing: 1rem; Text { color: whitesmoke; - font-size: 2rem; + font-size: 2.5rem; text: stopPlaceData.stopName; horizontal-alignment: left; - padding-bottom: 1rem; } Divider {} @@ -75,16 +76,16 @@ export component TransportationWidget{ in property <[StopPlaceData]> stopPlacesData; VerticalLayout { + spacing: 2rem; + Text { color: whitesmoke; - font-size: 3rem; + font-size: 4rem; text: "Busstider"; horizontal-alignment: left; } HorizontalLayout { - padding-top: 1rem; - for stopPlace in stopPlacesData : DisplayColumn { stopPlaceData: stopPlace; } From 545a675712813c426652f721a921512378fd4ab9 Mon Sep 17 00:00:00 2001 From: andpas Date: Wed, 7 Aug 2024 13:51:11 +0200 Subject: [PATCH 08/11] * Changes spacing to make room for XKCD. --- ui/mainwindow.slint | 10 +++++----- ui/transportation.slint | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ui/mainwindow.slint b/ui/mainwindow.slint index b204efd..b3078e7 100644 --- a/ui/mainwindow.slint +++ b/ui/mainwindow.slint @@ -61,7 +61,7 @@ export component MainWindow inherits Window { VerticalLayout { width: 100%; padding: 3rem; - spacing: 8rem; + spacing: 4rem; alignment: start; HorizontalLayout { @@ -89,15 +89,15 @@ export component MainWindow inherits Window { tracking: foodTracking; } - TransportationWidget { - stopPlacesData: stopPlacesData; - } - CalendarWidget { events: events; meetings: []; } + TransportationWidget { + stopPlacesData: stopPlacesData; + } + XkcdWidget { max-height: 30rem; xkcd: xkcd; diff --git a/ui/transportation.slint b/ui/transportation.slint index 1613aa4..3e3b32e 100644 --- a/ui/transportation.slint +++ b/ui/transportation.slint @@ -17,33 +17,33 @@ component DisplayRow { in property stopPlaceDataRow; VerticalLayout { - spacing: 1rem; + spacing: 0.75rem; HorizontalLayout { alignment: start; Image { - height: 1.75rem; + height: 1.5rem; width: 7.5%; source: stopPlaceDataRow.transportMode; } Text { - font-size: 1.75rem; + font-size: 1.5rem; width: 7.5%; text: stopPlaceDataRow.publicCode; color: whitesmoke; } Text { - font-size: 1.75rem; + font-size: 1.5rem; width: 70%; text: stopPlaceDataRow.destinationFrontText; color: whitesmoke; } Text { - font-size: 1.75rem; + font-size: 1.5rem; width: 15%; text: stopPlaceDataRow.departureTime; - color: stopPlaceDataRow.realtime ? yellow : whitesmoke; + color: stopPlaceDataRow.realtime ? whitesmoke : yellow; } } From 4afb47e4e90e8a7ab44d05c34793338e4e14e52c Mon Sep 17 00:00:00 2001 From: andpas Date: Wed, 7 Aug 2024 13:58:56 +0200 Subject: [PATCH 09/11] Revert no-frame. --- ui/mainwindow.slint | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/mainwindow.slint b/ui/mainwindow.slint index b3078e7..7e7c864 100644 --- a/ui/mainwindow.slint +++ b/ui/mainwindow.slint @@ -52,7 +52,7 @@ export component MainWindow inherits Window { title: "Infoskjerm"; //TODO: Set programmatically? - //no-frame: true; + no-frame: true; //width: 1080px; height: 1900px; background: #0C0C27; From 1da0104207eec975ee66343646b466172ce63234 Mon Sep 17 00:00:00 2001 From: andpas Date: Wed, 7 Aug 2024 14:03:55 +0200 Subject: [PATCH 10/11] Remove unused reqwest-blocking. --- Cargo.lock | 1 - Cargo.toml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8a3521a..12ef231 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2227,7 +2227,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cdf7b487d864c2939b23902291a5041bc4a84418268f25fda1c8d4e15ad8fa" dependencies = [ "graphql_query_derive", - "reqwest", "serde", "serde_json", ] diff --git a/Cargo.toml b/Cargo.toml index eb701f9..24e3e0f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ selfie = [] [dependencies] chrono = { version = "0.4.26", features = ["serde", "unstable-locales"] } image = "0.24.7" -graphql_client = { version = "0.13.0", features = ["reqwest-blocking"] } +graphql_client = { version = "0.13.0" } reqwest = { version = "0.11.23", features = [ "json", "rustls-tls", From e10d65fc89c84042282ba1ba089ea811a2b3f41c Mon Sep 17 00:00:00 2001 From: andpas Date: Wed, 7 Aug 2024 14:14:45 +0200 Subject: [PATCH 11/11] F**k Icons. --- .gitignore | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.gitignore b/.gitignore index 1b7cf5a..2d922b5 100644 --- a/.gitignore +++ b/.gitignore @@ -7,10 +7,6 @@ .AppleDouble .LSOverride -# Icon must end with two \r -Icon - - # Thumbnails ._*