src/middleware/core.lisp @ 256edcc8ea1e

Use Dissect to clean up the error handling tremendously
author Steve Losh <steve@stevelosh.com>
date Sun, 21 Aug 2016 13:34:46 +0000
parents 3e9db801d234
children 919ebd924aac
(in-package #:nrepl)

(defvar *middleware* (fset:empty-map))


(defmacro handle-op (message op fallback &rest body)
  `(if (equal ,op (fset:lookup ,message "op"))
    (progn ,@body)
    (funcall ,fallback ,message)))

(defmacro define-middleware (name op message-binding &body body)
  "Define a middleware at the symbol `name` to handle `op`.

  As the body is executing `message-binding` will be bound to the message map.

  "
  (let ((fallback (gensym)))
    `(defun ,name (,fallback)
      (lambda (,message-binding)
        (handle-op ,message-binding ,op ,fallback
                   ,@body)))))