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.coerceValue(node, schemaType, variables)
  14. variables = variables or {}
  15. if schemaType.__type == 'NonNull' then
  16. return util.coerceValue(node, schemaType.ofType, variables)
  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, variables)
  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, variables)
  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. function util.compose (f,g)
  60. return function(...) return f(g(...)) end
  61. end
  62. function util.bind1(func, val1)
  63. return function (val2)
  64. return func(val1, val2)
  65. end
  66. end
  67. return util