-
Notifications
You must be signed in to change notification settings - Fork 29
Description
I am writing a plist DSL for possibly non-technical users that is translated via yason to a JSON specification. Simple example:
'(:title "foo")
(:command my-command)
...)
where my-command is a symbol whose property list I need to encode as part of the transformation.
My first thought was to subclass symbol and then write a specialised encode method for it, but this implementation (SBCL) doesn't allow base classes as super classes.
The documentation for *symbol-encoder*:
symbol-encoder
Function to call to translate a CL symbol into a JSON string. The default is to error out, to provide backwards-compatible behaviour.
A useful function that can be bound to this variable is YASON:ENCODE-SYMBOL-AS-LOWERCASE.
seems to suggest that I could write a streaming method and then bind it to *symbol-encoder*, however in the case of yason:encode ((object symbol)) ..., *symbol-encoder* simply returns a string for further processing and not JSON (and there's no available stream either).
What I've managed to get working is to bind to *symbol-encoder* a function that extracts the properties and writes them out as a plist, or string for symbols that don't have interesting properties for this application. However, this requires me to modify yason's encoder for symbols to relax the assertion for a string value. It doesn't seem like there's an easy way for me to override the processing for symbols.
I'd rather not ask users to download a custom version of yason, and would like to know if I missed other options, or if there's a more idiomatic way to do this. If there's no better way to do this, could we make the assertion accept a/p-lists as well as strings? (or perhaps anything that could be further encoded by yason)