|
201 | 201 | [& pred-forms] |
202 | 202 | `(and-spec-impl '~(mapv #(res &env %) pred-forms) ~(vec pred-forms) nil)) |
203 | 203 |
|
| 204 | +(defn- res-kind |
| 205 | + [env opts] |
| 206 | + (let [{kind :kind :as mopts} opts] |
| 207 | + (->> |
| 208 | + (if kind |
| 209 | + (assoc mopts :kind `~(res env kind)) |
| 210 | + mopts) |
| 211 | + (mapcat identity)))) |
| 212 | + |
204 | 213 | (defmacro every |
205 | 214 | "takes a pred and validates collection elements against that pred. |
206 | 215 |
|
|
231 | 240 | See also - coll-of, every-kv |
232 | 241 | " |
233 | 242 | [pred & {:keys [into kind count max-count min-count distinct gen-max gen-into gen] :as opts}] |
234 | | - (let [nopts (-> opts (dissoc :gen) (assoc ::kind-form `'~(res &env (:kind opts)))) |
| 243 | + (let [desc (::describe opts) |
| 244 | + nopts (-> opts |
| 245 | + (dissoc :gen ::describe) |
| 246 | + (assoc ::kind-form `'~(res &env (:kind opts)) |
| 247 | + ::describe (clojure.core/or desc `'(every ~(res &env pred) ~@(res-kind &env opts))))) |
235 | 248 | gx (gensym) |
236 | 249 | cpreds (cond-> [(list (clojure.core/or kind `coll?) gx)] |
237 | 250 | count (conj `(= ~count (c/bounded-count ~count ~gx))) |
|
253 | 266 | See also - map-of" |
254 | 267 |
|
255 | 268 | [kpred vpred & opts] |
256 | | - `(every (tuple ~kpred ~vpred) ::kfn (fn [i# v#] (nth v# 0)) :into {} ~@opts)) |
| 269 | + (let [desc `(every-kv ~(res &env kpred) ~(res &env vpred) ~@(res-kind &env opts))] |
| 270 | + `(every (tuple ~kpred ~vpred) ::kfn (fn [i# v#] (nth v# 0)) :into {} ::describe '~desc ~@opts))) |
257 | 271 |
|
258 | 272 | (defmacro coll-of |
259 | 273 | "Returns a spec for a collection of items satisfying pred. Unlike |
|
267 | 281 |
|
268 | 282 | See also - every, map-of" |
269 | 283 | [pred & opts] |
270 | | - `(every ~pred ::conform-all true ~@opts)) |
| 284 | + (let [desc `(coll-of ~(res &env pred) ~@(res-kind &env opts))] |
| 285 | + `(every ~pred ::conform-all true ::describe '~desc ~@opts))) |
271 | 286 |
|
272 | 287 | (defmacro map-of |
273 | 288 | "Returns a spec for a map whose keys satisfy kpred and vals satisfy |
|
280 | 295 |
|
281 | 296 | See also - every-kv" |
282 | 297 | [kpred vpred & opts] |
283 | | - `(every-kv ~kpred ~vpred ::conform-all true :kind map? ~@opts)) |
| 298 | + (let [desc `(map-of ~(res &env kpred) ~(res &env vpred) ~@(res-kind &env opts))] |
| 299 | + `(every-kv ~kpred ~vpred ::conform-all true :kind map? ::describe '~desc ~@opts))) |
284 | 300 |
|
285 | 301 | (defmacro * |
286 | 302 | "Returns a regex op that matches zero or more values matching |
|
0 commit comments