util.lua 2.1 KB

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