2
0

util.lua 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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.trim(s)
  38. return s:gsub('^%s+', ''):gsub('%s$', ''):gsub('%s%s+', ' ')
  39. end
  40. function util.coerceValue(node, schemaType, variables)
  41. variables = variables or {}
  42. if schemaType.__type == 'NonNull' then
  43. return util.coerceValue(node, schemaType.ofType, variables)
  44. end
  45. if not node then
  46. return nil
  47. end
  48. if node.kind == 'variable' then
  49. return variables[node.name.value]
  50. end
  51. if schemaType.__type == 'List' then
  52. if node.kind ~= 'list' then
  53. error('Expected a list')
  54. end
  55. return util.map(node.values, function(value)
  56. return util.coerceValue(value, schemaType.ofType, variables)
  57. end)
  58. end
  59. if schemaType.__type == 'InputObject' then
  60. if node.kind ~= 'inputObject' then
  61. error('Expected an input object')
  62. end
  63. return util.map(node.values, function(field)
  64. if not schemaType.fields[field.name] then
  65. error('Unknown input object field "' .. field.name .. '"')
  66. end
  67. return util.coerceValue(field.value, schemaType.fields[field.name].kind, variables)
  68. end)
  69. end
  70. if schemaType.__type == 'Enum' then
  71. if node.kind ~= 'enum' then
  72. error('Expected enum value, got ' .. node.kind)
  73. end
  74. if not schemaType.values[node.value] then
  75. error('Invalid enum value "' .. node.value .. '"')
  76. end
  77. return node.value
  78. end
  79. if schemaType.__type == 'Scalar' then
  80. if schemaType.parseLiteral(node) == nil then
  81. error('Could not coerce "' .. tostring(node.value) .. '" to "' .. schemaType.name .. '"')
  82. end
  83. return schemaType.parseLiteral(node)
  84. end
  85. end
  86. return util