git.fiddlerwoaroof.com
json-file.lisp
89eb0c67
 (defpackage :fwoar.json-file
   (:use :cl )
   (:export json))
 (in-package :fwoar.json-file)
 
 (defclass json (asdf:cl-source-file)
9445d9e8
   ((package :initarg :package
             :reader json-package
             :initform (error "must have a package"))
    (transform :initarg :transform
               :reader json-transform
               :initform ''identity)))
89eb0c67
 (defclass generate-lisp-op (asdf:downward-operation)
   ())
 (defmethod asdf:component-depends-on ((o asdf:compile-op) (component json))
   (format t "~&...~%")
   `((generate-lisp-op ,component) ,@(call-next-method)))
 
 (defvar *ht-pprint-dispatch* (copy-pprint-dispatch *print-pprint-dispatch*))
 (defvar *empty-package* (make-package (symbol-name (gensym)) :use ()))
 (defmethod asdf:perform ((op generate-lisp-op) (c json))
   (let* ((lisp-file (car (asdf:input-files 'asdf:load-source-op
                                            c)))
          (json-file (merge-pathnames (make-pathname :type "json")
                                      lisp-file))
          (*package* *empty-package*)
          (*print-pretty* t)
          (*print-case* :upcase))
9445d9e8
     (alexandria:with-output-to-file (s lisp-file
                                        :if-exists :supersede
                                        :if-does-not-exist :create)
89eb0c67
       (pprint `(defpackage ,(json-package c) (:use) (:export :+data+))
               s)
       (fresh-line s)
9445d9e8
       (princ (serapeum:string-replace
               "#:~A"
               (with-output-to-string (str)
                 (let ((*print-readably* t))
                   (pprint
945d4add
                    `(defparameter #:~a
9445d9e8
                       (funcall ,(json-transform c)
                                (let ((yason:*parse-json-null-as-keyword* t)
                                      (yason:*parse-json-arrays-as-vectors* t)
                                      (yason:*parse-json-booleans-as-symbols* t))
                                  (yason:parse
                                   ,(alexandria:read-file-into-string json-file)))))
                    str)))
               (format nil "~a:~a"
                       (json-package c)
                       :+data+))
89eb0c67
              s))
     (values)))