Как обработать поле, которое может возвращать один из нескольких скалярных типов в 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

примечание: эта реализация на самом деле допускает и плавающие

Другие вопросы по тегам