Low-level Specs for web APIs/form fields that coerce string->type and also generate strings.
[Updated 2021-04-22: coercing specs are a less than good idea and we are moving away from these, instead adopting coax for the coercions -- which it can derive from specs -- followed by standard validation or confirmation via specs.]
deps.edn
:
clj -Sdeps '{:deps {worldsingles/web-specs {:mvn/version "0.1.1"}}}'
Leiningen / Boot Dependency:
[worldsingles/web-specs "0.1.1"]
All the specs defined here accept strings that coerce to a given type, as well as values of that type, and will generate strings that can be coerced to that type.
:ws.web.spec/boolean
-- a spec forBoolean
values:ws.web.spec/long
-- a spec forlong
values:ws.web.spec/opt-long
-- a spec for "optional"long
values (nil
and""
are accepted,nil
will be generated -- but not""
):ws.web.spec/pos-int
-- a spec for positive integer values (based onpos-int?
):ws.web.spec/age
-- a spec for positive integer values in the range 18..120:ws.web.spec/double
-- a spec fordouble
values:ws.web.spec/opt-double
-- a spec for "optional"double
values (nil
and""
are accepted,nil
will be generated -- but not""
):ws.web.spec/date
-- a spec for date values:ws.web.spec/opt-date
-- a spec for "optional" date values (nil
and""
are accepted,nil
will be generated -- but not""
):ws.web.spec/date-time
-- a spec for date time values:ws.web.spec/opt-date-time
-- a spec for "optional" date time values (nil
and""
are accepted,nil
will be generated -- but not""
)
For dates, the following formats are accepted:
yyyy/M/d
M/d/yyyy
yyyy-M-d
M-d-yyyy
M/d/yy
-- short years are considered 20xxM-d-yy
-- short years are considered 20xxEEE MMM dd HH:mm:ss zzz yyyy
-- e.g.,"Fri Sep 20 13:02:00 PDT 2019"
For date times, the format corresponds to ISO 8601: yyyy-MM-ddTHH:mm:ss.SSSZ
-- e.g., "2020-04-05T22:28:12.000Z"
All generated dates are strings of the form MM/dd/yyyy
.
These specs are all built on two macros that wrap low-level coercions and predicates to produce string->type coercing specs:
param-spec
,opt-param-spec
These accept a "coercion function", an optional "stringify" function, and a spec:
- Coercion: accept a value of the target type, or a string representation of such a value and either convert it to the target type or produce
:clojure.spec.alpha/invalid
- Stringify: accept a value of the target type and produce a string representation of it (that can be coerced back to the original value) -- this defaults to
str
- Spec: a spec for the target type that will successfully generate values of that type
In addition, the following "coercions" are defined that accept strings or a given type, and produce :clojure.spec.alpha/invalid
on bad input:
->boolean
,->long
,->double
, and->date
For ->long
, ->double
, and ->date
there are utility coerce->...
functions that accept the given type or a string that they will attempt to coerce to the given type, throwing exceptions on bad input. These are used to build the ->...
coercions but are left public in case they are useful in other contexts.
Finally, there is a convenience function that accepts a comma-separated list of numbers and will coerce that to a vector of long values, or produce :clojure.spec.alpha/invalid
on bad input:
split->longs
- 0.1.1 -- Jun 09, 2020 -- adds
date-time
spec and support functions (PR #2 @juan-ignacio-848) - 0.1.0 -- Sep 20, 2019 -- first public release.
Copyright © 2017-2019 World Singles Networks llc.
Distributed under the Eclipse Public License version 1.0.