Travel-Status-MOTIS/lib/Travel/Status/MOTIS/Stopover.pm
package Travel::Status::MOTIS::Stopover;
use strict;
use warnings;
use 5.020;
use parent 'Class::Accessor';
use DateTime::Format::ISO8601;
our $VERSION = '0.03';
Travel::Status::MOTIS::Stopover->mk_ro_accessors(
qw(
stop
is_cancelled
is_realtime
arrival
scheduled_arrival
realtime_arrival
departure
scheduled_departure
realtime_departure
delay
arrival_delay
departure_delay
track
scheduled_track
realtime_track
)
);
sub new {
my ( $obj, %opt ) = @_;
my $json = $opt{json};
my $realtime = $opt{realtime} // 0;
my $cancelled = $opt{cancelled};
my $time_zone = $opt{time_zone};
my $ref = {
stop => Travel::Status::MOTIS::Stop->from_stopover( json => $json ),
is_realtime => $realtime,
is_cancelled => $json->{cancelled} // $cancelled,
};
if ( $json->{scheduledArrival} ) {
$ref->{scheduled_arrival} = DateTime::Format::ISO8601->parse_datetime(
$json->{scheduledArrival} );
$ref->{scheduled_arrival}->set_time_zone( $time_zone );
}
if ( $json->{arrival} and $realtime ) {
$ref->{realtime_arrival}
= DateTime::Format::ISO8601->parse_datetime( $json->{arrival} );
$ref->{realtime_arrival}->set_time_zone( $time_zone );
}
if ( $json->{scheduledDeparture} ) {
$ref->{scheduled_departure} = DateTime::Format::ISO8601->parse_datetime(
$json->{scheduledDeparture} );
$ref->{scheduled_departure}->set_time_zone( $time_zone );
}
if ( $json->{departure} and $realtime ) {
$ref->{realtime_departure}
= DateTime::Format::ISO8601->parse_datetime( $json->{departure} );
$ref->{realtime_departure}->set_time_zone( $time_zone );
}
if ( $ref->{scheduled_arrival} and $ref->{realtime_arrival} ) {
$ref->{arrival_delay} = $ref->{realtime_arrival}
->subtract_datetime( $ref->{scheduled_arrival} )->in_units('minutes');
}
if ( $ref->{scheduled_departure} and $ref->{realtime_departure} ) {
$ref->{departure_delay}
= $ref->{realtime_departure}
->subtract_datetime( $ref->{scheduled_departure} )
->in_units('minutes');
}
if ( $json->{scheduledTrack} ) {
$ref->{scheduled_track} = $json->{scheduledTrack};
}
if ( $json->{track} ) {
$ref->{realtime_track} = $json->{track};
}
$ref->{delay} = $ref->{arrival_delay} // $ref->{departure_delay};
$ref->{arrival} = $ref->{realtime_arrival} // $ref->{scheduled_arrival};
$ref->{departure} = $ref->{realtime_departure}
// $ref->{scheduled_departure};
$ref->{track} = $ref->{realtime_track} // $ref->{scheduled_track};
bless( $ref, $obj );
return $ref;
}
sub TO_JSON {
my ($self) = @_;
my $ret = { %{$self} };
for my $timestamp_key (
qw(
arrival
scheduled_arrival
realtime_arrival
departure
scheduled_departure
realtime_departure
)
)
{
if ( $ret->{$timestamp_key} ) {
$ret->{$timestamp_key} = $ret->{$timestamp_key}->epoch;
}
}
return $ret;
}
1;