git.fiddlerwoaroof.com
Raw Blame History
(defpackage :type-providers
  (:use :cl )
  (:export ))
(in-package :type-providers)

(defun load-keys (file)
  (fset:reduce 'fset:union
               (fset:image 'fset:domain
                           (edn:parse (alexandria:read-file-into-string file)
                                      'edn:fset-lossy))))

(define-condition non-exhaustive-switch (style-warning)
  ((keys :initarg :keys :reader nes-keys)
   (cases :initarg :cases :reader nes-cases))
  (:report (lambda (c s)
             (format s "Missing cases: ~s"
                     (fset:set-difference (nes-keys c)
                                          (fset:convert 'fset:set (nes-cases c)))))))

(defmacro field-switch ((s file) &body body)
  (let* ((keys (load-keys file)))
    `(lambda (,s)
       (let (,@(fset:convert 'list
                             (fset:image (lambda (x)
                                           `(,(intern (symbol-name x)
                                                      *package*)
                                              (fset:lookup ,s ,x)))
                                         keys)))
         ,@body))))

(field-switch (s "types.edn")
  )