Skip to content

Instantly share code, notes, and snippets.

@viebel viebel/spec.cljs forked from swannodette/spec.cljs
Last active Jun 8, 2016

What would you like to do? query spec
(:require [cljs.spec :as s]))
(s/def ::ident (s/and vector? (s/cat :ident keyword? :value #(not (coll? %)))))
(s/def ::join-key (s/or :prop keyword? :ident ::ident))
(s/def ::join (s/and (s/map-of ::join-key ::query) #(= (count %) 1)))
(s/def ::union (s/and (s/map-of keyword? ::query) #(> (count %) 1)))
(s/def ::param-expr
(s/cat :query-expr ::query-expr
:params map?))
(s/def ::mutation-expr
(s/or :no-params (s/cat :mutate-key symbol?)
:with-params (s/cat :mutate-key symbol?
:params map?)))
(s/def ::query-expr
(s/or :prop keyword?
:ident ::ident
:mutation-expr ::mutation-expr
:union ::union
:param-expr ::join))
(s/def ::query
(s/or :recursion (s/or :depth number?
:unbounded #(= % '...))
:query (s/and vector?
(s/+ ::query-expr))))
(s/explain-str ::query '[:name {:friend "foo"}])
; val: [:name {:friend "foo"}] fails at: [:recursion :depth] predicate: number?
; val: [:name {:friend "foo"}] fails at: [:recursion :unbounded] predicate: (= % (quote ...))
; In: [1] val: ({:friend "foo"}) fails at: [:query] predicate: (cat :_ (*, Extra input
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.