[spec] Generic spec walking for clojure.spec
Activity
Tommi Tommi August 23, 2019 at 5:03 AM
Tommi Tommi February 27, 2019 at 8:16 AM
There are three different versions for ~this in spec-tools now:
1) spec-walker: using `s/form`, walks the specs and values and calls a callback function with both, returning a new value. It can be used for things like coercion. It doesn't validate, need to call `s/valid?` and `s/explain-data` separately (2-3 calls in total)
2) spec-visitor: just walks the forms and return new forms. Used in things like spec => json-schema transformations. Not transforming values.
3) wrapped specs with overridden `s/conform*`, returning new value or error. It's the saddest of the three, because everything needs to be wrapped, but still the only one that knows how to walk over properly regex specs. Bundled transform + validate, like with Schema.
...
https://cljdoc.org/d/metosin/spec-tools/0.9.0/doc/spec-coercion has examples of the first/coercion, hopefully highlighting why support for coercion is important.
Is this issue on a (near) roadmap? Can we help with it? If not on the roadmap, is there a suggested way to do runtime value transformations with spec?
Alex Miller July 11, 2018 at 12:20 AM
No plans to look at this before the next batch of implementation changes, so it will be a while.
import July 10, 2018 at 11:11 PM
Comment made by: marco.m
hello, any news ?
Tommi Tommi April 17, 2018 at 1:40 PM
Renamed the issue. Instead of Keyword argument, it should take a function to walk the spec to support arbitrary walking applications.
Implement the 2, spec-visitor, into an experimental external data modelling party library that uses reified protocols like spec, allowing simple and generic model->model transformations using protocols. I think the spec implementation would look about the same - the protocol-based approach is really simple. I would most likely add the `
op`
as first argument into the visitor callback for spec.here’s the polished PR for the lib:https://github.com/metosin/malli/pull/46/files