You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

232 lines
6.6 KiB

// To parse this JSON data, do
//
// final trainData = trainDataFromJson(jsonString);
import 'dart:convert';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'train_data.freezed.dart';
part 'train_data.g.dart';
TrainData trainDataFromJson(String str) => TrainData.fromJson(json.decode(str));
String trainDataToJson(TrainData data) => json.encode(data.toJson());
/// Results of scrapping InfoFer website for train info
@freezed
class TrainData with _$TrainData {
const TrainData._();
const factory TrainData({
required String rank,
required String number,
required String date,
required String operator,
required List<TrainDataGroup> groups,
}) = _TrainData;
factory TrainData.fromJson(Map<String, dynamic> json) => _$TrainDataFromJson(json);
List<TrainDataStation> get stations => groups.first.stations;
TrainDataRoute get route => groups.first.route;
TrainDataStatus? get status => groups.first.status;
}
@freezed
class TrainDataGroup with _$TrainDataGroup {
const factory TrainDataGroup({
required TrainDataRoute route,
required List<TrainDataStation> stations,
TrainDataStatus? status,
}) = _TrainDataGroup;
factory TrainDataGroup.fromJson(Map<String, dynamic> json) => _$TrainDataGroupFromJson(json);
}
/// Route of the train
@freezed
class TrainDataRoute with _$TrainDataRoute {
const factory TrainDataRoute({
required String from,
required String to,
}) = _TrainDataRoute;
factory TrainDataRoute.fromJson(Map<String, dynamic> json) => _$TrainDataRouteFromJson(json);
}
@freezed
class TrainDataStation with _$TrainDataStation {
const factory TrainDataStation({
required String name,
required String linkName,
required int km,
int? stoppingTime,
String? platform,
StationArrDepTime? arrival,
StationArrDepTime? departure,
@TrainDataNoteConverter()
required List<TrainDataNote> notes,
}) = _TrainDataStation;
factory TrainDataStation.fromJson(Map<String, dynamic> json) => _$TrainDataStationFromJson(json);
}
@freezed
class StationArrDepTime with _$StationArrDepTime {
const factory StationArrDepTime({
required DateTime scheduleTime,
StationArrDepTimeStatus? status,
}) = _StationArrDepTime;
factory StationArrDepTime.fromJson(Map<String, dynamic> json) => _$StationArrDepTimeFromJson(json);
}
@freezed
class StationArrDepTimeStatus with _$StationArrDepTimeStatus {
const factory StationArrDepTimeStatus({
required int delay,
required bool real,
required bool cancelled,
}) = _StationArrDepTimeStatus;
factory StationArrDepTimeStatus.fromJson(Map<String, dynamic> json) => _$StationArrDepTimeStatusFromJson(json);
}
@freezed
class TrainDataStatus with _$TrainDataStatus {
const TrainDataStatus._();
const factory TrainDataStatus({
required int delay,
required String station,
required TrainDataStatusState state,
}) = _TrainDataStatus;
factory TrainDataStatus.fromJson(Map<String, dynamic> json) => _$TrainDataStatusFromJson(json);
@override
String toString() {
String result = '';
if (delay == 0) {
result += 'La timp';
}
else {
result += '${delay.abs()} min';
}
result += ' la ';
result += switch (state) {
TrainDataStatusState.passing => 'trecerea fără oprire prin',
TrainDataStatusState.arrival => 'sosirea în',
TrainDataStatusState.departure => 'plecarea din',
};
result += station;
return result;
}
}
enum TrainDataStatusState { passing, arrival, departure }
abstract class TrainDataNote {
final String kind;
const TrainDataNote({required this.kind});
Map<String, dynamic> toJson() => {
"kind": kind,
};
}
class TrainDataNoteConverter implements JsonConverter<TrainDataNote, Map<String, dynamic>> {
const TrainDataNoteConverter();
@override
TrainDataNote fromJson(Map<String, dynamic> json) {
return switch(json['kind']) {
'trainNumberChange' => TrainDataNoteTrainNumberChange.fromJson(json),
'departsAs' => TrainDataNoteDepartsAs.fromJson(json),
'detachingWagons' => TrainDataNoteDetachingWagons.fromJson(json),
'receivingWagons' => TrainDataNoteReceivingWagons.fromJson(json),
_ => TrainDataNoteUnknown.fromJson(json),
};
}
@override
Map<String, dynamic> toJson(TrainDataNote object) {
return object.toJson();
}
}
@freezed
class TrainDataNoteTrainNumberChange with _$TrainDataNoteTrainNumberChange implements TrainDataNote {
@Implements<TrainDataNote>()
const factory TrainDataNoteTrainNumberChange({
// base
@Default("trainNumberChange")
String kind,
// impl
required String rank,
required String number,
}) = _TrainDataNoteTrainNumberChange;
factory TrainDataNoteTrainNumberChange.fromJson(Map<String, dynamic> json) => _$TrainDataNoteTrainNumberChangeFromJson(json);
}
@freezed
class TrainDataNoteDepartsAs with _$TrainDataNoteDepartsAs implements TrainDataNote {
@Implements<TrainDataNote>()
const factory TrainDataNoteDepartsAs({
// base
@Default("departsAs")
String kind,
// impl
required String rank,
required String number,
required DateTime departureDate,
}) = _TrainDataNoteDepartsAs;
factory TrainDataNoteDepartsAs.fromJson(Map<String, dynamic> json) => _$TrainDataNoteDepartsAsFromJson(json);
}
@freezed
class TrainDataNoteDetachingWagons with _$TrainDataNoteDetachingWagons implements TrainDataNote {
@Implements<TrainDataNote>()
const factory TrainDataNoteDetachingWagons({
// base
@Default("detachingWagons")
String kind,
// impl
required String station,
}) = _TrainDataNoteDetachingWagons;
factory TrainDataNoteDetachingWagons.fromJson(Map<String, dynamic> json) => _$TrainDataNoteDetachingWagonsFromJson(json);
}
@freezed
class TrainDataNoteReceivingWagons with _$TrainDataNoteReceivingWagons implements TrainDataNote {
@Implements<TrainDataNote>()
const factory TrainDataNoteReceivingWagons({
// base
@Default("receivingWagons")
String kind,
// impl
required String station,
}) = _TrainDataNoteReceivingWagons;
factory TrainDataNoteReceivingWagons.fromJson(Map<String, dynamic> json) => _$TrainDataNoteReceivingWagonsFromJson(json);
}
@freezed
class TrainDataNoteUnknown with _$TrainDataNoteUnknown implements TrainDataNote {
@Implements<TrainDataNote>()
const factory TrainDataNoteUnknown({
// base
required String kind,
// impl
required Map<String, dynamic> extra,
}) = _TrainDataNoteUnknown;
factory TrainDataNoteUnknown.fromJson(Map<String, dynamic> json) => TrainDataNoteUnknown(
kind: json['kind'],
extra: Map.from(json)..remove('kind'),
);
}