File indexing completed on 2024-05-12 04:42:40

0001 /*
0002     SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #ifndef KPUBLICTRANSPORT_OPENTRIPPLANNERPARSER_H
0008 #define KPUBLICTRANSPORT_OPENTRIPPLANNERPARSER_H
0009 
0010 #include "kpublictransport_export.h"
0011 #include "opentripplannerrequestcontext.h"
0012 
0013 #include <KPublicTransport/Location>
0014 #include <KPublicTransport/RentalVehicle>
0015 
0016 #include <QHash>
0017 #include <QString>
0018 #include <QStringList>
0019 
0020 #include <vector>
0021 
0022 class QJsonArray;
0023 class QJsonObject;
0024 
0025 namespace KPublicTransport {
0026 
0027 class Journey;
0028 class JourneySection;
0029 class Line;
0030 class Route;
0031 class Stopover;
0032 
0033 /** Parser for OTP responses as defined by the GraphQL files in the otp/ subdir.
0034  *  @internal only exported for unit tests
0035  */
0036 class KPUBLICTRANSPORT_EXPORT OpenTripPlannerParser
0037 {
0038 public:
0039     explicit OpenTripPlannerParser(const QString &identifierType, const QString &ifoptPrefix = {});
0040     ~OpenTripPlannerParser();
0041     void setKnownRentalVehicleNetworks(const QHash<QString, RentalVehicleNetwork> &networks);
0042 
0043     std::vector<Location> parseLocationsByCoordinate(const QJsonObject &obj) const;
0044     std::vector<Location> parseLocationsByName(const QJsonObject &obj) const;
0045     std::vector<Location> parseLocationsArray(const QJsonArray &array) const;
0046     std::vector<Location> parseGeocodeResult(const QJsonArray &array) const;
0047     std::vector<Stopover> parseDepartures(const QJsonObject &obj) const;
0048     std::vector<Stopover> parseDeparturesArray(const QJsonArray &array) const;
0049     std::vector<Journey> parseJourneys(const QJsonObject &obj);
0050 
0051     OpenTripPlannerRequestContext m_nextJourneyContext;
0052     OpenTripPlannerRequestContext m_prevJourneyContext;
0053 private:
0054     QVariant parseRentalVehicleData(const QJsonObject &obj) const;
0055     /// @return @c false for Location objects that should be discarded entirely
0056     bool parseLocationFragment(const QJsonObject &obj, Location &loc) const;
0057     Location parseLocation(const QJsonObject &obj) const;
0058     void parseAlerts(const QJsonArray &alertsArray) const;
0059     Line parseLine(const QJsonObject &obj) const;
0060     Route parseRoute(const QJsonObject &obj) const;
0061     Route parseInlineRoute(const QJsonObject &obj) const;
0062     Route detectAndParseRoute(const QJsonObject &obj) const;
0063     Stopover parseDeparture(const QJsonObject &obj) const;
0064     void parseDeparturesForStop(const QJsonObject &obj, std::vector<Stopover> &deps) const;
0065     JourneySection parseJourneySection(const QJsonObject &obj) const;
0066     Journey parseJourney(const QJsonObject &obj) const;
0067 
0068     QString m_identifierType;
0069     QString m_ifoptPrefix;
0070     QHash<QString, RentalVehicleNetwork> m_rentalVehicleNetworks;
0071     mutable QStringList m_alerts;
0072 };
0073 
0074 }
0075 
0076 #endif // KPUBLICTRANSPORT_OPENTRIPPLANNERPARSER_H