Explorar el Código

argumentsOfCorrectType;

bjorn hace 9 años
padre
commit
c710e58479
Se han modificado 3 ficheros con 60 adiciones y 2 borrados
  1. 1 1
      parse.lua
  2. 57 0
      rules.lua
  3. 2 1
      validate.lua

+ 1 - 1
parse.lua

@@ -263,7 +263,7 @@ local graphQL = P {
   arguments = P('(') * Ct(V('argument') ^ 1) * P(')'),
   value = space * (variable + V('objectValue') + V('listValue') + enumValue + stringValue + booleanValue + floatValue + intValue),
   listValue = P('[') * Ct((V('value') * comma) ^ 0) * P(']') / cList,
-  objectFieldValue = C(rawName) * space * P(':') * space * V('value') * comma / cObjectField,
+  objectFieldValue = space * C(rawName) * space * P(':') * space * V('value') * comma / cObjectField,
   objectValue = P('{') * space * Ct(V('objectFieldValue') ^ 0) * space * P('}') / cObject,
   type = V('nonNullType') + V('listType') + V('namedType'),
   namedType = name / cNamedType,

+ 57 - 0
rules.lua

@@ -178,4 +178,61 @@ function rules.uniqueArgumentNames(node, context)
   end
 end
 
+function rules.argumentsOfCorrectType(node, context)
+  local function validateType(argumentType, valueNode)
+    if argumentType.__type == 'NonNull' then
+      return validateType(argumentType.ofType, valueNode)
+    end
+
+    if argumentType.__type == 'List' then
+      if valueNode.kind ~= 'list' then
+        error('Expected a list')
+      end
+
+      for i = 1, #valueNode.values do
+        validateType(argumentType.ofType, valueNode.values[i])
+      end
+    end
+
+    if argumentType.__type == 'InputObject' then
+      if valueNode.kind ~= 'object' then
+        error('Expected an object')
+      end
+
+      for _, field in ipairs(valueNode.values) do
+        if not argumentType.fields[field.name] then
+          error('Unknown input object field "' .. field.name .. '"')
+        end
+
+        validateType(argumentType.fields[field.name].kind, field.value)
+      end
+    end
+
+    if argumentType.__type == 'Enum' then
+      if valueNode.kind ~= 'enum' then
+        error('Expected enum value, got ' .. valueNode.kind)
+      end
+
+      if not argumentType.values[valueNode.value] then
+        error('Invalid enum value "' .. valueNode.value .. '"')
+      end
+    end
+
+    if argumentType.__type == 'Scalar' then
+      if argumentType.parseLiteral(valueNode) == nil then
+        error('Could not coerce "' .. valueNode.value .. '" to "' .. argumentType.name .. '"')
+      end
+    end
+  end
+
+  if node.arguments then
+    local parentField = context.objects[#context.objects - 1].fields[node.name.value]
+    for _, argument in pairs(node.arguments) do
+      local name = argument.name.value
+      local argumentType = parentField.arguments[name]
+      validateType(argumentType, argument.value)
+    end
+  end
+end
+
 return rules

+ 2 - 1
validate.lua

@@ -60,7 +60,8 @@ local visitors = {
       rules.argumentsDefinedOnType,
       rules.scalarFieldsAreLeaves,
       rules.compositeFieldsAreNotLeaves,
-      rules.uniqueArgumentNames
+      rules.uniqueArgumentNames,
+      rules.argumentsOfCorrectType
     }
   },