::GraphQL::ObjectType.define do
name ValidatorReflection.schema_name
field :abscence, types.Boolean do
resolve ->(obj, _args, _ctx) do
obj < ActiveModel::Validations::AbsenceValidator
end
end
field :prescence, types.Boolean do
resolve ->(obj, _args, _ctx) do
obj < ActiveModel::Validations::PrescenceValidator
end
end
field :uniqueness, types.Boolean do
resolve ->(obj, _args, _ctx) do
obj < ActiveModel::Validations::UniquenessValidator
end
end
field :with_format, types.String do
resolve ->(obj, _args, _ctx) do
return nil unless obj < ActiveModel::Validations::FormatValidator
obj.options[:with]
end
end
field :without_format, types.String do
resolve ->(obj, _args, _ctx) do
return nil unless obj < ActiveModel::Validations::FormatValidator
obj.options[:without]
end
end
field :min_length, types.Int do
resolve ->(obj, _args, _ctx) do
return nil unless obj < ActiveModel::Validations::LengthValidator
obj.options[:minimum]
end
end
field :max_length, types.Int do
resolve ->(obj, _args, _ctx) do
return nil unless obj < ActiveModel::Validations::LengthValidator
obj.options[:maximum]
end
end
field :inclusion, types.String.to_list_type do
resolve ->(obj, _args, _ctx) do
return nil unless obj < ActiveModel::Validations::InclusionValidator
return nil if obj.options[:in].respond_to? :call
obj.options[:in]
end
end
field :exclusion, types.String.to_list_type do
resolve ->(obj, _args, _ctx) do
return nil unless obj < ActiveModel::Validations::ExclusionValidator
return nil if obj.options[:in].respond_to? :call
obj.options[:in]
end
end
end
::GraphQL::ObjectType.define do
name AttributeReflection.schema_name
field :name, !types.String
field :validators, ValidatorType.to_list_type
field :validate, ValidationResultType do
argument :int, types.Int
argument :str, types.String
argument :float, types.Float
argument :bool, types.Boolean
resolve ->(obj, args, _ctx) do
values = [args['int'], args['str'], args['float'], args['bool']]
raise ArgumentError, "Must specify at least one argument" if values.compact.empty?
raise ArgumentError, "Too many arguments, one expected" if values.compact.size > 1
value = values.compact.first
model = obj.klass.new
model[obj.name] = value
model.validate!
ValidationResult.new(model.valid?, model.errors[obj.name])
end
end
end