util.lua 2.0 KB

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