This is a cross-post of the Issue in the original venia repository as it seems dead: https://github.com/Vincit/venia/issues/36. Currently the [spec](https://github.com/district0x/graphql-query/blob/master/src/graphql_query/spec.cljc#L157) describes allows to be a `:variable/type` to be only a `keyword`: ```clj (s/def :variable/type keyword?) ``` This works fine in many cases but is for our use case a serious limitation. I would propose to add functionality to suport all valid GraphQL input types as described in the [GraphQL Spec](http://facebook.github.io/graphql/October2016/#sec-Types). Here are some examples: I will use following query as an example (and modify it accordingly): ```graphql query Foo($Foo:Int){employee{name}} ``` The corresponding Venia query (as it works now without problems) is: ```clj {:venia/operation {:operation/name "Foo" :operation/type :query} :venia/variables [{:variable/name "Foo" :variable/type :Int}] :venia/queries [[:employee [:name]]]} ``` I will focus now only on the `:venia/variables` part: ## Simple variable GraphQL: ```graphql query Foo($Foo:Int){employee{name}} ``` Variables: ```clj [{:variable/name "Foo" :variable/type :Int}] ``` ## Required variable GraphQL: ```graphql query Foo($Foo:Int!){employee{name}} ``` Variables: ```clj [{:variable/name "Foo" :variable/type {:type/type :Int :type/required? true}}] ``` Another option would be to add a `:variable/required?` key to the variable map but I personally dislike this option as the `required`-property is part of the type and not the variable definition. ## List GraphQL: ```graphql query Foo($Foo:[Int!]!){employee{name}} ``` Variables: ```clj [{:variable/name "Foo" :variable/type {:type/kind :list ;; :type/kind instead of :type/type! :type.list/items {:type/type :Int :type/required? true} :type/required? true}}] ``` I do not particulary like the `:type/kind` declaration as there is only one valid value (`:list`) for it but I do not see another nice way to do so. I mislike the idea to add a special `:type/type` called `:List` as it is not reserved by the GraphQL specification (as far as I can see) and someone may add a custom `:List` type to their schema and then this will break. # Final remarks According to the GraphQL specification this are the only valid options for the variable types. ## Implementation @r0man already implemented a way to add Lists as types [here](https://github.com/r0man/venia/commit/349c90bace42120f430205d2b68512ed8a62cf78) but it misses following patterns (when I read the code correctly): `[Int]!`, `[[Int]]` and so on. I will provide an implemenation (and create a PR) as soon as possible but would be happy for any feedback for this solution approach.