Unverified Commit 385b25b9 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

add primitive stopseq output

TODO: Proper classes, locality/parent handling, et cetera
parent 28ba9a1b
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
@@ -258,6 +258,26 @@ sub display_result {
	return;
}

sub show_stopseq {
	my $trip = $efa->result;

	printf( "%s %s → %s\n",
		$trip->line, $trip->number // q{},
		$trip->dest_name );

	for my $stop ( $trip->route ) {
		printf( "%s → %s  %s\n",
			$stop->{sched_arr}
			? ( $stop->{rt_arr} // $stop->{sched_arr} )->strftime('%H:%M')
			: q{     },
			$stop->{sched_dep}
			? ( $stop->{rt_dep} // $stop->{sched_dep} )->strftime('%H:%M')
			: q{     },
			$stop->{name_full},
		);
	}
}

sub show_lines {
	my @output;

@@ -449,7 +469,10 @@ if ( my $err = $efa->errstr ) {
	exit 2;
}

if ($list_lines) {
if ($stopseq) {
	show_stopseq();
}
elsif ($list_lines) {
	show_lines();
}
else {
+7 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ use JSON;
use Travel::Status::DE::EFA::Line;
use Travel::Status::DE::EFA::Departure;
use Travel::Status::DE::EFA::Stop;
use Travel::Status::DE::EFA::Trip;
use LWP::UserAgent;

my %efa_instance = (
@@ -568,6 +569,12 @@ sub results {
	return @results;
}

sub result {
	my ($self) = @_;

	return Travel::Status::DE::EFA::Trip->new( json => $self->{response} );
}

# static
sub get_efa_urls {
	return map {
+94 −0
Original line number Diff line number Diff line
package Travel::Status::DE::EFA::Trip;

use strict;
use warnings;
use 5.010;

use DateTime::Format::Strptime;

use parent 'Class::Accessor';

our $VERSION = '2.02';

Travel::Status::DE::EFA::Trip->mk_ro_accessors(
	qw(operator name line number type id dest_name dest_id));

sub new {
	my ( $obj, %conf ) = @_;

	my $json = $conf{json}{transportation};

	my $ref = {
		operator     => $json->{operator}{name},
		polyline     => $json->{coords},
		name         => $json->{name},
		line         => $json->{disassembledName},
		number       => $json->{properties}{trainNumber},
		type         => $json->{properties}{trainType},
		id           => $json->{id},
		dest_name    => $json->{destination}{name},
		dest_id      => $json->{destination}{id},
		route_raw    => $json->{locationSequence},
		strptime_obj => DateTime::Format::Strptime->new(
			pattern   => '%Y-%m-%dT%H:%M:%SZ',
			time_zone => 'UTC'
		),
	};
	return bless( $ref, $obj );
}

sub polyline {
	my ($self) = @_;

	return @{ $self->{polyline} // [] };
}

sub parse_dt {
	my ( $self, $value ) = @_;

	if ($value) {
		my $dt = $self->{strptime_obj}->parse_datetime($value);
		if ($dt) {
			return $dt->set_time_zone('Europe/Berlin');
		}
	}
	return undef;
}

sub route {
	my ($self) = @_;

	if ( $self->{route} ) {
		return @{ $self->{route} };
	}

	for my $stop ( @{ $self->{route_raw} // [] } ) {
		push(
			@{ $self->{route} },
			{
				sched_arr => $self->parse_dt( $stop->{arrivalTimePlanned} ),
				sched_dep => $self->parse_dt( $stop->{departureTimePlanned} ),
				rt_arr    => $self->parse_dt( $stop->{arrivalTimeEstimated} ),
				rt_dep    => $self->parse_dt( $stop->{departureTimeEstimated} ),
				latlon    => $stop->{coord},
				name_full => $stop->{name},
				name      => $stop->{parent}{disassembledName},
				place     => $stop->{parent}{parent}{name},
				niveau    => $stop->{niveau},
				id        => $stop->{id},
			}
		);
	}

	delete $self->{route_raw};

	return @{ $self->{route} // [] };
}

sub TO_JSON {
	my ($self) = @_;

	return { %{$self} };
}

1;