summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Travel/Routing/DE/VRR.pm100
1 files changed, 79 insertions, 21 deletions
diff --git a/lib/Travel/Routing/DE/VRR.pm b/lib/Travel/Routing/DE/VRR.pm
index 695feaa..73de3d1 100644
--- a/lib/Travel/Routing/DE/VRR.pm
+++ b/lib/Travel/Routing/DE/VRR.pm
@@ -4,11 +4,29 @@ use strict;
use warnings;
use 5.010;
-use Carp qw(confess);
use Travel::Routing::DE::VRR::Route;
use LWP::UserAgent;
use XML::LibXML;
+use Exception::Class (
+ 'Travel::Routing::DE::VRR::Exception::Setup' => {
+ description => 'invalid argument on setup',
+ fields => [ 'option', 'have', 'want' ],
+ },
+ 'Travel::Routing::DE::VRR::Exception::Net' => {
+ description => 'could not submit POST request',
+ fields => 'http_response',
+ },
+ 'Travel::Routing::DE::VRR::Exception::NoData' =>
+ { description => 'got no data to parse', },
+ 'Travel::Routing::DE::VRR::Exception::Ambiguous' => {
+ description => 'ambiguous input',
+ fields => [ 'post_key', 'possibilities' ],
+ },
+ 'Travel::Routing::DE::VRR::Exception::NoConnections' =>
+ { description => 'got no connections', },
+);
+
our $VERSION = '1.3';
sub set_time {
@@ -25,11 +43,18 @@ sub set_time {
$time = $conf{arrival_time};
}
else {
- confess('time: Specify either departure_time or arrival_time');
+ Travel::Routing::DE::VRR::Exception::Setup->throw(
+ option => 'time',
+ error => 'Specify either departure_time or arrival_time'
+ );
}
if ( $time !~ / ^ [0-2]? \d : [0-5]? \d $ /x ) {
- confess("time: must match HH:MM - '${time}'");
+ Travel::Routing::DE::VRR::Exception::Setup->throw(
+ option => 'time',
+ have => $time,
+ want => 'HH:MM',
+ );
}
@{ $self->{post} }{ 'itdTimeHour', 'itdTimeMinute' } = split( /:/, $time );
@@ -54,12 +79,22 @@ sub date {
my ( $day, $month, $year ) = split( /[.]/, $date );
- if ( not defined $day or not length($day) or $day < 1 or $day > 31 ) {
- confess("date: invalid day, must match DD.MM[.[YYYY]] - '${date}'");
- }
- if ( not defined $month or not length($month) or $month < 1 or $month > 12 )
+ if (
+ not( defined $day
+ and length($day)
+ and $day >= 1
+ and $day <= 31
+ and defined $month
+ and length($month)
+ and $month >= 1
+ and $month <= 12 )
+ )
{
- confess("date: invalid month, must match DD.MM[.[YYYY]] - '${date}'");
+ Travel::Routing::DE::VRR::Exception::Setup->throw(
+ option => 'date',
+ have => $date,
+ want => 'DD.MM[.[YYYY]]'
+ );
}
if ( not defined $year or not length($year) ) {
@@ -89,7 +124,11 @@ sub exclude {
}
}
if ( not $ok ) {
- confess("exclude: Unsupported type '${exclude_type}'");
+ Travel::Routing::DE::VRR::Exception::Setup->throw(
+ option => 'exclude',
+ have => $exclude_type,
+ want => join( ' / ', @mapping ),
+ );
}
}
@@ -112,8 +151,10 @@ sub select_interchange_by {
when ('waittime') { $self->{post}->{routeType} = 'LEASTINTERCHANGE' }
when ('distance') { $self->{post}->{routeType} = 'LEASTWALKING' }
default {
- confess(
-"select_interchange_by: Must be speed/waittime/distance: '${prefer}'"
+ Travel::Routing::DE::VRR::Exception::Setup->throw(
+ option => 'select_interchange_by',
+ have => $prefer,
+ want => 'speed / waittime / distance',
);
}
}
@@ -129,7 +170,11 @@ sub train_type {
when ('ic') { $self->{post}->{lineRestriction} = 401 }
when ('ice') { $self->{post}->{lineRestriction} = 400 }
default {
- confess("train_type: Must be local/ic/ice: '${include}'");
+ Travel::Routing::DE::VRR::Exception::Setup->throw(
+ option => 'train_type',
+ have => $include,
+ want => 'local / ic / ice',
+ );
}
}
@@ -151,7 +196,11 @@ sub walk_speed {
$self->{post}->{changeSpeed} = $walk_speed;
}
else {
- confess("walk_speed: Must be normal/fast/slow: '${walk_speed}'");
+ Travel::Routing::DE::VRR::Exception::Setup->throw(
+ option => 'walk_speed',
+ have => $walk_speed,
+ want => 'normal / fast / slow',
+ );
}
return;
@@ -169,7 +218,10 @@ sub place {
my ( $self, $which, $place, $stop, $type ) = @_;
if ( not( $place and $stop ) ) {
- confess('place: Need >= three elements');
+ Travel::Routing::DE::VRR::Exception::Setup->throw(
+ option => 'place',
+ error => 'Need >= three elements'
+ );
}
$type //= 'stop';
@@ -435,22 +487,24 @@ sub new {
$ref->create_post();
+ if ( not( defined $conf{submit} and $conf{submit} == 0 ) ) {
+ $ref->submit( %{ $conf{lwp_options} } );
+ }
+
return $ref;
}
sub submit {
my ( $self, %conf ) = @_;
- $conf{autocheck} = 1;
-
$self->{ua} = LWP::UserAgent->new(%conf);
my $response = $self->{ua}
->post( 'http://efa.vrr.de/vrr/XSLT_TRIP_REQUEST2', $self->{post} );
if ( $response->is_error ) {
- my $errstr = $response->status_line;
- confess("Could not submit POST request: ${errstr}");
+ Travel::Routing::DE::VRR::Exception::Net->throw(
+ http_response => $response, );
}
# XXX (workaround)
@@ -478,7 +532,7 @@ sub parse {
$self->check_no_connections();
if ( @{$raw_cons} == 0 ) {
- confess('Got no data to parse');
+ Travel::Routing::DE::VRR::Exception::NoData->throw();
}
return 1;
@@ -501,7 +555,10 @@ sub check_ambiguous {
}
my $err_text = join( q{, }, @possible );
- confess("Ambiguous input for '${post_key}': '${err_text}'");
+ Travel::Routing::DE::VRR::Exception::Ambiguous->throw(
+ post_key => $post_key,
+ possibilities => $err_text,
+ );
}
return;
@@ -518,7 +575,8 @@ sub check_no_connections {
if ($err_node) {
my $text = $err_node->parentNode()->parentNode()->textContent();
- confess("Got no connections: '${text}'");
+ Travel::Routing::DE::VRR::Exception::NoConnections->throw(
+ error => $text, );
}
return;