util.lua 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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.compose(f, g)
  14. return function(...) return f(g(...)) end
  15. end
  16. function util.bind1(func, x)
  17. return function(y)
  18. return func(x, y)
  19. end
  20. end
  21. function util.coerceValue(node, schemaType, variables)
  22. variables = variables or {}
  23. if schemaType.__type == 'NonNull' then
  24. return util.coerceValue(node, schemaType.ofType, variables)
  25. end
  26. if not node then
  27. return nil
  28. end
  29. if node.kind == 'variable' then
  30. return variables[node.name.value]
  31. end
  32. if schemaType.__type == 'List' then
  33. if node.kind ~= 'list' then
  34. error('Expected a list')
  35. end
  36. return util.map(node.values, function(value)
  37. return util.coerceValue(node.values[i], schemaType.ofType, variables)
  38. end)
  39. end
  40. if schemaType.__type == 'InputObject' then
  41. if node.kind ~= 'inputObject' then
  42. error('Expected an input object')
  43. end
  44. return util.map(node.values, function(field)
  45. if not schemaType.fields[field.name] then
  46. error('Unknown input object field "' .. field.name .. '"')
  47. end
  48. return util.coerceValue(schemaType.fields[field.name].kind, field.value, variables)
  49. end)
  50. end
  51. if schemaType.__type == 'Enum' then
  52. if node.kind ~= 'enum' then
  53. error('Expected enum value, got ' .. node.kind)
  54. end
  55. if not schemaType.values[node.value] then
  56. error('Invalid enum value "' .. node.value .. '"')
  57. end
  58. return node.value
  59. end
  60. if schemaType.__type == 'Scalar' then
  61. if schemaType.parseLiteral(node) == nil then
  62. error('Could not coerce "' .. tostring(node.value) .. '" to "' .. schemaType.name .. '"')
  63. end
  64. return schemaType.parseLiteral(node)
  65. end
  66. end
  67. return util