From fb6cc611c7f9990e17e0e709c29b0239cb7346eb Mon Sep 17 00:00:00 2001 From: Dimitri Lozeve Date: Tue, 20 Sep 2022 21:40:03 +0200 Subject: [PATCH] Handle API error more gracefully --- server.ss | 19 +++++++++++++------ sncf.ss | 4 ++++ sncf/api.ss | 17 +++++++++-------- sncf/display.ss | 30 ++++++++++++++++++------------ 4 files changed, 44 insertions(+), 26 deletions(-) diff --git a/server.ss b/server.ss index 184c7f7..ad9a255 100755 --- a/server.ss +++ b/server.ss @@ -38,10 +38,6 @@ ;; / (def (departures-handler req res) (let/cc return - (infof "~a ~a ~a" - (http-request-method req) - (http-request-path req) - (inet-address->string (http-request-client req))) (def sncf-key (getenv "SNCF_AUTH_KEY" #f)) (unless sncf-key (errorf "No SNCF API authentication key found. Set the SNCF_AUTH_KEY environment variable.") @@ -52,8 +48,6 @@ (def accept-header (assoc "Accept" headers)) (when accept-header (set! accept-header (cdr accept-header))) (def params (parse-request-params (http-request-params req))) - (def station (assoc "station" params)) - (when station (set! station (cdr station))) (def datetime-str (assoc "datetime" params)) (def datetime (if datetime-str (try @@ -65,10 +59,23 @@ (cdr datetime-str))) (return))) #f)) + (def station (assoc "station" params)) + (when station (set! station (cdr station))) (define-values (station-name station-id) (if (string? station) (get-station-id sncf-key station) (values "Vernon - Giverny (Vernon)" "stop_area:SNCF:87415604"))) + (unless station-name + (set! station-name "Vernon - Giverny")) + (unless station-id + (set! station-id "stop_area:SNCF:87415604")) + (infof "~a ~a ~a ~a (\"~a\")~a" + (inet-address->string (http-request-client req)) + (http-request-method req) + (http-request-path req) + station-name + station + (if datetime (string-append " at " (cdr datetime-str)) "")) (define-values (departures disruptions) (get-departures sncf-key station-id datetime)) (def content (cond diff --git a/sncf.ss b/sncf.ss index 9a01e55..cc92fdf 100755 --- a/sncf.ss +++ b/sncf.ss @@ -20,6 +20,10 @@ (if station (get-station-id sncf-key station) (values "Vernon - Giverny (Vernon)" "stop_area:SNCF:87415604"))) + (unless station-name + (set! station-name "Vernon - Giverny")) + (unless station-id + (set! station-id "stop_area:SNCF:87415604")) (define-values (departures disruptions) (get-departures sncf-key station-id datetime)) (display-all departures disruptions station-name datetime) (when mattermost-url diff --git a/sncf/api.ss b/sncf/api.ss index 29c5b5c..d654501 100644 --- a/sncf/api.ss +++ b/sncf/api.ss @@ -4,6 +4,7 @@ (import :std/format :std/iter + :std/logger :std/net/request :std/net/uri :std/srfi/19 @@ -19,11 +20,11 @@ (let ((pts (hash-ref req-json 'pt_objects #f))) (if (and pts (not (null? pts))) (values (hash-ref (car pts) 'name) (hash-ref (car pts) 'id)) - (begin (display (format "No station found for \"~a\".\n" station) (current-error-port)) - (exit 1))))) - (begin (display (format "Failed to query the SNCF API: ~a ~a\n" - (request-status req) (request-status-text req))) - (exit 1)))) + (begin (warnf "No station found for \"~a\"." station) + (values #f #f))))) + (begin (warnf "Failed to query the SNCF API: ~a ~a" + (request-status req) (request-status-text req)) + (values #f #f)))) (def (get-departures sncf-key station-id (datetime #f)) (def url (format "~a/stop_areas/~a/departures" +sncf-url+ station-id)) @@ -35,9 +36,9 @@ (let (req-json (request-json req)) (values (parse-departures (hash-ref req-json 'departures)) (hash-ref req-json 'disruptions))) - (begin (display (format "Failed to query the SNCF API: ~a ~a\n" - (request-status req) (request-status-text req))) - (exit 1)))) + (begin (warnf "Failed to query the SNCF API: ~a ~a" + (request-status req) (request-status-text req)) + (values #f #f)))) (defstruct departure (network direction base-datetime datetime)) diff --git a/sncf/display.ss b/sncf/display.ss index 2ccbcac..1f58935 100644 --- a/sncf/display.ss +++ b/sncf/display.ss @@ -45,15 +45,21 @@ (displayln (if (null? messages) "[Pas de message]" (hash-ref (car messages) 'text)))))) (def (display-all departures disruptions station-name (datetime #f) style: (style 'unicode)) - (display - (if (eq? style 'markdown) - (format "Prochains départs de **~a** " station-name) - (parse-markup - (format "[bold]Prochains départs de [green]~a[/green] " station-name)))) - (when datetime - (display (format "le ~a à ~a " - (date->string datetime "~d ~b ~Y") - (date->string datetime "~H:~M")))) - (displayln (if (eq? style 'markdown) ":\n" ":")) - (display-departures-table departures style: style) - (display-disruptions disruptions style: style)) + (let/cc return + (unless departures + (displayln (format "Aucun départ prévu de ~a~a" + station-name + (if datetime (string-append " le " (date->string datetime "~d ~b ~Y"))))) + (return)) + (display + (if (eq? style 'markdown) + (format "Prochains départs de **~a** " station-name) + (parse-markup + (format "[bold]Prochains départs de [green]~a[/green] " station-name)))) + (when datetime + (display (format "le ~a à ~a " + (date->string datetime "~d ~b ~Y") + (date->string datetime "~H:~M")))) + (displayln (if (eq? style 'markdown) ":\n" ":")) + (display-departures-table departures style: style) + (display-disruptions disruptions style: style)))