import 'package:json_annotation/json_annotation.dart'; part 'construction_report.g.dart'; @JsonSerializable(createToJson: false) class ConstructionReport { final String id; @JsonKey(name: 'nr', fromJson: int.parse) final int index; @JsonKey(name: 'termin', fromJson: _parseListOrString) final List timePeriodTexts; @JsonKey(name: 'termin_pins', fromJson: _parseListOrString) final List timePeriodPinsTexts; @JsonKey(name: 'termin_zeit', fromJson: _parseListOrString) final List timePeriodTimeTexts; final String headline; final String headlinePins; @JsonKey(name: 'meldung', fromJson: _parseListOrString) final List messages; @JsonKey(name: 'meldung_pins', fromJson: _parseListOrString) final List messagesPins; @JsonKey(name: 'meldung_hinweis', fromJson: _parseListOrString) final List messagesHint; @JsonKey(name: 'hinweis_tabelle', fromJson: _parseListOrString) final List hintTable; @JsonKey(name: 'grund') final String reason; @JsonKey(name: 'abschnitt') final List affectedStations; final DateTime lastChange; @JsonKey(name: 'ics') final String icsUrl; @JsonKey(name: 'termine', fromJson: _parseTimeRanges) final List timeRanges; @JsonKey(name: 'von') final DateTime startDate; @JsonKey(name: 'bis') final DateTime endDate; ConstructionReport( {this.id, this.index, this.timePeriodTexts, this.timePeriodPinsTexts, this.timePeriodTimeTexts, this.headline, this.headlinePins, this.messages, this.messagesPins, this.messagesHint, this.hintTable, this.reason, this.affectedStations, this.lastChange, this.icsUrl, this.timeRanges, this.startDate, this.endDate}); factory ConstructionReport.fromJson(Map json) => _$ConstructionReportFromJson(json); static List _parseTimeRanges(List ranges) { return ranges.map((range) => TimeRange._fromJson(range)).toList(); } static List _parseListOrString(dynamic input) { switch (input.runtimeType) { case String: return [input]; case List: return input; default: return [input.toString()]; } } } class TimeRange { final DateTime begin; final DateTime end; final bool allDay; final List weekdays; const TimeRange({this.begin, this.end, this.allDay, this.weekdays}); TimeRange._fromJson(Map json) : begin = _parseTimeStamp(json, 'von'), end = _parseTimeStamp(json, 'bis'), allDay = json['ganztaegig'] == '1', weekdays = json['wochentage'] is List ? (json['wochentage'] as List) .map((day) => int.parse(day)) .toList() : null; static DateTime _parseTimeStamp(Map json, String suffix) { return DateTime.parse( "${json["datum_$suffix"]} ${json["st_$suffix"]}:${json["min_$suffix"]}:00"); } }