(in-package :fwoar.lack.json.middleware) ;; json middleware (defparameter *result-lens* (data-lens.lenses:make-list-lens 2)) (defun json-middleware (app) (lambda (env) (let ((res (funcall app env))) (data-lens.lenses:over *result-lens* 'encode-result res)))) (defun encode-json-to-string (v) (yason:with-output-to-string* (:indent t) (yason:encode v yason::*json-output*))) (defclass json-result () ((%v :initarg :v :reader json-value))) (defun wrap-result (v) (make-instance 'json-result :v v)) (defgeneric encode-result (v) (:method (v) v) (:method ((v json-result)) (list (encode-json-to-string (json-value v))))) (defmethod yason:encode ((o fset:seq) &optional s) (yason:encode (coerce (fset:convert 'list o) 'vector) s)) (defmethod yason:encode ((o fset:map) &optional s) (yason:encode (fset:convert 'hash-table o) s))