Skip to content

Commit

Permalink
[RFC] Add Validation rule for unique directives per location.
Browse files Browse the repository at this point in the history
This rule was suggested by @jjergus (#223) to remove ambiguity from execution where the `@skip` and `@ignore` directive rules make the assumption that only one is defined per selection.

In general I think this assumption should be upheld by valid queries overall, not just for `@skip` and `@include` so that it can be relied upon for any usage of directives. For example, this allows a potential optimization to use a hashmap keyed on directive name to represent the directives at a location rather than an array.

Closes #223
  • Loading branch information
leebyron committed Oct 29, 2016
1 parent 79caa41 commit 65d1512
Showing 1 changed file with 39 additions and 0 deletions.
39 changes: 39 additions & 0 deletions spec/Section 5 -- Validation.md
Original file line number Diff line number Diff line change
Expand Up @@ -1242,6 +1242,45 @@ query @skip(if: $foo) {
```


### Directives Are Unique Per Location

** Formal Specification **

* For every {location} in the document for which Directives can apply:
* Let {directives} be the set of Directives which apply to {location}.
* For each {directive} in {directives}:
* Let {directiveName} be the name of {directive}.
* Let {namedDirectives} be the set of all Directives named {directiveName}
in {directives}.
* {namedDirectives} must be a set of one.

** Explanatory Text **

Directives are used to describe some metadata or behavioral change on the
definition they apply to. When more than one directive of the same name is used,
the expected metadata or behavior becomes ambiguous, therefore only one of each
directive is allowed per location.

For example, the following query will not pass validation because `@skip` has
been used twice for the same field:

```!graphql
query ($foo: Boolean = true, $bar: Boolean = false) {
field @skip(if: $foo) @skip(if: $bar)
}
```

However this example is valid because `@skip` has been used only once per
location, despite being used twice in the query:

```graphql
query ($foo: Boolean = true, $bar: Boolean = false) {
fieldA @skip(if: $foo)
fieldB @skip(if: $bar)
}
```


## Variables

### Variable Uniqueness
Expand Down

0 comments on commit 65d1512

Please sign in to comment.