CLJ2116: Support for selective conforming with clojure.spec #1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
THIS IS A DUMMY PR for discussion purposes, will create a patch via Jira is gets further.
What
Support separation of
conform
from Specs, allowing different conforming to be run for same specs at runtime.This is already implemented in spec-tools, but it needs to use Dynamic Binding and wrap specs into Spec Records to make this work.
Why
Allows Specs to be used as a runtime transformation engine, main use cases being the Web: sending and receiving Spec'd data over different formats (String, JSON, Transit) without needing to write manually differently conforming specs for all combinations.
How
cc
(conforming callback) to:conform*
,explain*
,conform
,explain
,explain-data
andexplain-str
: all support the old arities, causingcc
to be set tonil
conform*
andexplain*
always have the extra parameter, passed on to internal spec functionscc
is set inconform
, it is called with aspec
argument. It should return eithernil
(default case, run conform as before) or a anonymousconform*
function, which is used to pre-conform the value before passing it to normal conformconform*
fromconform* need to be called via top-level
conform` - which has a perf optimized arity for this.Todo
explain
Notes
The actual supporting converters (string->long, string->keyword) and
Conforming Callback
could be hosted in non-core project like in spec-tools to enable moving fast - and supporting both clj & cljs.Example