(use-modules (ice-9 filesystem) (logging logger) (srfi srfi-9) (ordo connection) (ordo interceptor) (ordo logger)) (define-record-type (make-play name connection vars interceptors) play? (connection play-connection) (vars play-vars) (name play-name) (interceptors play-interceptors)) (define* (play #:key name connection (interceptors '()) (vars '())) (make-play name connection vars interceptors)) (define (run-play play) (dynamic-wind (lambda () (log-msg 'NOTICE "Running play: " (play-name play)) (init-connection! (play-connection play))) (lambda () (let ((ctx (init-context (play-connection play) #:vars (play-vars play)))) (execute ctx (play-interceptors play)) (if (context-error ctx) (log-msg 'ERROR "Play " (play-name play) " terminated with error: " (context-error ctx)) (log-msg 'NOTICE "Completed play: " (play-name play))))) (lambda () (close-connection! (play-connection play))))) (define test-play (play #:name "Test play" #:connection (local-connection) #:vars '((base-dir . "/home/ray/ordo-test")) #:interceptors (list (interceptor "Handle errors" #:error (lambda (ctx err) (log-msg 'WARN "Handling error " err) (set-context-error! ctx #f))) (interceptor "Create base directory" #:enter (lambda (ctx) (must ctx "mkdir" "-p" (unbind ctx base-dir)))) (interceptor "Create test file" #:enter (lambda (ctx) (must ctx "touch" (file-name-join* (unbind ctx base-dir) "test-file")))) (interceptor "Throw an error" #:enter (lambda (ctx) (error "badness"))))))