1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
# frozen_string_literal: true
module JSONSchemer
module Draft7
module Vocab
module Validation
class Ref < Draft202012::Vocab::Core::Ref
def self.exclusive?
true
end
end
class AdditionalItems < Keyword
def error(formatted_instance_location:, **)
"array items at #{formatted_instance_location} do not match `additionalItems` schema"
end
def parse
subschema(value)
end
def validate(instance, instance_location, keyword_location, context)
items = schema.parsed['items']&.parsed
if !instance.is_a?(Array) || !items.is_a?(Array) || items.size >= instance.size
return result(instance, instance_location, keyword_location, true)
end
offset = items.size
nested = instance.slice(offset..-1).map.with_index do |item, index|
parsed.validate_instance(item, join_location(instance_location, (offset + index).to_s), keyword_location, context)
end
result(instance, instance_location, keyword_location, nested.all?(&:valid), nested, :annotation => nested.any?)
end
end
class ContentEncoding < Draft202012::Vocab::Content::ContentEncoding
def error(formatted_instance_location:, **)
"string at #{formatted_instance_location} could not be decoded using encoding: #{value}"
end
def validate(instance, instance_location, keyword_location, _context)
return result(instance, instance_location, keyword_location, true) unless instance.is_a?(String)
valid, annotation = parsed.call(instance)
result(instance, instance_location, keyword_location, valid, :annotation => annotation)
end
end
class ContentMediaType < Draft202012::Vocab::Content::ContentMediaType
def error(formatted_instance_location:, **)
"string at #{formatted_instance_location} could not be parsed using media type: #{value}"
end
def validate(instance, instance_location, keyword_location, context)
return result(instance, instance_location, keyword_location, true) unless instance.is_a?(String)
decoded_instance = context.adjacent_results[ContentEncoding]&.annotation || instance
valid, annotation = parsed.call(decoded_instance)
result(instance, instance_location, keyword_location, valid, :annotation => annotation)
end
end
end
end
end
end
|