Как обработать поле, которое может возвращать один из нескольких скалярных типов в graphql
В graphql (используя превосходный гем graphql-ruby) я пытаюсь вернуть объект с полем, которое может равняться либо Boolean, Integer, либо String. Моей первоначальной мыслью было вернуть объединение Boolean, Integer или String, но graphql-ruby сообщил мне, что объединения не могут содержать скалярные типы (я думаю, что это ограничение, наложенное спецификацией, а не graphql-ruby).
Решение, которое я могу придумать (не очень хорошее), - вернуть значение в виде строки json и проанализировать его на стороне клиента. Есть ли лучший способ обработать возвращаемое значение, которое может быть одним из нескольких скаляров?
Спасибо!
1 ответ
Я смог добиться этого, создав собственный скалярный тип graphql, который просто проверяет, является ли значение логическим, целочисленным или String, и, если это так, возвращает это значение без изменений. В противном случае возвращается ошибка. Это решение не требует дополнительного разбора на стороне клиента.
В graphql-ruby реализация выглядит так:
GraphScalar::AnyPrimative = GraphQL::ScalarType.define do
name "AnyPrimativeScalar"
coerce_input ->(value, ctx) {
case value
when String, TrueClass, FalseClass, Integer, Float then value
else
GraphQL::ExecutionError.new("Invalid value type: #{value.class.name}")
end
}
coerce_result ->(value, ctx) {
case value
when String, TrueClass, FalseClass, Integer, Float then value
else
GraphQL::ExecutionError.new("Invalid value type: #{value.class.name}")
end
}
end
примечание: эта реализация на самом деле допускает и плавающие