Skip to content

Instantly share code, notes, and snippets.

@viebel
Forked from swannodette/spec.cljs
Last active June 8, 2016 14:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save viebel/547e5236f52cf3ba04f9cbc495841769 to your computer and use it in GitHub Desktop.
Save viebel/547e5236f52cf3ba04f9cbc495841769 to your computer and use it in GitHub Desktop.
om.next query spec
(ns om.next.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 :_ (* :om.next.spec/query-expr)), Extra input
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment