util.lua 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. local util = {}
  2. function util.map(t, fn)
  3. local res = {}
  4. for k, v in pairs(t) do res[k] = fn(v, k) end
  5. return res
  6. end
  7. function util.find(t, fn)
  8. local res = {}
  9. for k, v in pairs(t) do
  10. if fn(v, k) then return v end
  11. end
  12. end
  13. function util.coerceValue(node, schemaType, variables)
  14. variables = variables or {}
  15. if schemaType.__type == 'NonNull' then
  16. return util.coerceValue(node, schemaType.ofType)
  17. end
  18. if not node then
  19. return nil
  20. end
  21. if node.kind == 'variable' then
  22. return variables[node.name.value]
  23. end
  24. if schemaType.__type == 'List' then
  25. if node.kind ~= 'list' then
  26. error('Expected a list')
  27. end
  28. return util.map(node.values, function(value)
  29. return util.coerceValue(node.values[i], schemaType.ofType)
  30. end)
  31. end
  32. if schemaType.__type == 'InputObject' then
  33. if node.kind ~= 'inputObject' then
  34. error('Expected an input object')
  35. end
  36. return util.map(node.values, function(field)
  37. if not schemaType.fields[field.name] then
  38. error('Unknown input object field "' .. field.name .. '"')
  39. end
  40. return util.coerceValue(schemaType.fields[field.name].kind, field.value)
  41. end)
  42. end
  43. if schemaType.__type == 'Enum' then
  44. if node.kind ~= 'enum' then
  45. error('Expected enum value, got ' .. node.kind)
  46. end
  47. if not schemaType.values[node.value] then
  48. error('Invalid enum value "' .. node.value .. '"')
  49. end
  50. return node.value
  51. end
  52. if schemaType.__type == 'Scalar' then
  53. if schemaType.parseLiteral(node) == nil then
  54. error('Could not coerce "' .. tostring(node.value) .. '" to "' .. schemaType.name .. '"')
  55. end
  56. return schemaType.parseLiteral(node)
  57. end
  58. end
  59. return util