ordo/tryme-interceptors.scm

55 lines
1.9 KiB
Scheme

(use-modules
(ice-9 filesystem)
(logging logger)
(srfi srfi-9)
(ordo connection)
(ordo interceptor)
(ordo logger))
(define-record-type <play>
(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"))))))