e9ecaa59 |
(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")
)
|