summaryrefslogtreecommitdiff
path: root/bin/efa
diff options
context:
space:
mode:
Diffstat (limited to 'bin/efa')
-rwxr-xr-xbin/efa108
1 files changed, 89 insertions, 19 deletions
diff --git a/bin/efa b/bin/efa
index 82ba7e3..b11018b 100755
--- a/bin/efa
+++ b/bin/efa
@@ -7,6 +7,7 @@ use warnings;
use 5.010;
use Travel::Routing::DE::VRR;
+use Exception::Class;
use Getopt::Long qw/:config no_ignore_case/;
our $VERSION = '1.3';
@@ -25,6 +26,71 @@ my $opt = {
binmode( STDOUT, ':encoding(utf-8)' );
binmode( STDERR, ':encoding(utf-8)' );
+sub handle_efa_exception {
+ my ($e) = @_;
+
+ if ( $e->isa('Travel::Routing::DE::VRR::Exception::Setup') ) {
+ if ( $e->message ) {
+ printf STDERR ( "Error: %s (option '%s'): %s\n", $e->description,
+ $e->message );
+ }
+ else {
+ printf STDERR (
+ "Error: %s (option '%s', got '%s', want '%s')\n",
+ $e->description, $e->option, $e->have, $e->want
+ );
+ }
+
+ exit 1;
+ }
+ if ( $e->isa('Travel::Routing::DE::VRR::Exception::Net') ) {
+ printf STDERR ( "Error: %s: %s\n", $e->description,
+ $e->http_errstr->as_string );
+ exit 2;
+ }
+ if ( $e->isa('Travel::Routing::DE::VRR::Exception::NoData') ) {
+ printf STDERR ( 'Error: %s', $e->description );
+ exit 3;
+ }
+ if ( $e->isa('Travel::Routing::DE::VRR::Exception::Ambiguous') ) {
+ printf STDERR (
+ "Error: %s for key %s. Specify one of %s\n",
+ $e->description, $e->post_key, $e->possibilities
+ );
+ exit 4;
+ }
+ if ( $e->isa('Travel::Routing::DE::VRR::Exception::NoConnections') ) {
+ printf STDERR ( "Error: %s: %s\n", $e->description, $e->error );
+ exit 5;
+ }
+
+ printf STDERR ( "Uncatched exception: %s\n%s", ref($e), $e->trace );
+ exit 10;
+}
+
+sub check_for_error {
+ my ($eval_error) = @_;
+
+ if ( not defined $efa ) {
+ if ( $eval_error
+ and ref($eval_error) =~ m{^Travel::Routing::DE::VRR::Exception}x )
+ {
+ handle_efa_exception($eval_error);
+ }
+ elsif ($eval_error) {
+ printf STDERR
+ "Unknown Travel::Routing::DE::VRR error:\n${eval_error}";
+ exit 10;
+ }
+ else {
+ say STDERR 'Travel::Routing::DE::VRR failed to return an object';
+ exit 10;
+ }
+ }
+
+ return;
+}
+
#<<<
GetOptions(
$opt,
@@ -80,25 +146,29 @@ if ( defined $opt->{'ignore-info'} and length( $opt->{'ignore-info'} ) == 0 ) {
$opt->{'ignore-info'} = undef;
}
-$efa = Travel::Routing::DE::VRR->new(
- origin => [ @from, $from_type ],
- destination => [ @to, $to_type ],
- via => ( @via ? [ @via, $via_type ] : undef ),
-
- arrival_time => $opt->{arrive},
- departure_time => $opt->{depart} // $opt->{time},
- date => $opt->{date},
- exclude => $opt->{exclude},
- train_type => $opt->{include},
- with_bike => $opt->{bike},
-
- select_interchange_by => $opt->{prefer},
- use_near_stops => $opt->{proximity},
- walk_speed => $opt->{'walk-speed'},
- max_interchanges => $opt->{'max-change'},
-);
-
-$efa->submit( timeout => $opt->{'timeout'} );
+$efa = eval {
+ Travel::Routing::DE::VRR->new(
+ origin => [ @from, $from_type ],
+ destination => [ @to, $to_type ],
+ via => ( @via ? [ @via, $via_type ] : undef ),
+
+ arrival_time => $opt->{arrive},
+ departure_time => $opt->{depart} // $opt->{time},
+ date => $opt->{date},
+ exclude => $opt->{exclude},
+ train_type => $opt->{include},
+ with_bike => $opt->{bike},
+
+ select_interchange_by => $opt->{prefer},
+ use_near_stops => $opt->{proximity},
+ walk_speed => $opt->{'walk-speed'},
+ max_interchanges => $opt->{'max-change'},
+
+ lwp_options => { timeout => $opt->{timeout} },
+ );
+};
+
+check_for_error($@);
my @routes = $efa->routes();