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)))
|