class Openapi3Parser::NodeFactory::Array::ValidNodeBuilder

Attributes

factory[R]
validatable[R]

Public Class Methods

data(factory, parent_context) click to toggle source
# File lib/openapi3_parser/node_factory/array.rb, line 107
def self.data(factory, parent_context)
  new(factory).data(parent_context)
end
errors(factory) click to toggle source
# File lib/openapi3_parser/node_factory/array.rb, line 103
def self.errors(factory)
  new(factory).errors
end

Private Class Methods

new(factory) click to toggle source
# File lib/openapi3_parser/node_factory/array.rb, line 111
def initialize(factory)
  @factory = factory
  @validatable = Validation::Validatable.new(factory)
end

Public Instance Methods

data(parent_context) click to toggle source
# File lib/openapi3_parser/node_factory/array.rb, line 126
def data(parent_context)
  if factory.use_default?
    return factory.default.nil? ? nil : build_node_data(parent_context)
  end

  TypeChecker.raise_on_invalid_type(factory.context, type: ::Array)
  check_values(raise_on_invalid: true)
  validate(raise_on_invalid: true)

  build_node_data(parent_context)
end
errors() click to toggle source
# File lib/openapi3_parser/node_factory/array.rb, line 116
def errors
  return validatable.collection if factory.nil_input?

  TypeChecker.validate_type(validatable, type: ::Array)
  return validatable.collection if validatable.errors.any?

  collate_errors
  validatable.collection
end

Private Instance Methods

build_node_data(parent_context) click to toggle source
# File lib/openapi3_parser/node_factory/array.rb, line 144
def build_node_data(parent_context)
  factory.data.each_with_index.map do |value, i|
    next value unless value.respond_to?(:node)

    Node::Placeholder.new(value, i, parent_context)
  end
end
check_field_type(context, raise_on_invalid) click to toggle source
# File lib/openapi3_parser/node_factory/array.rb, line 170
def check_field_type(context, raise_on_invalid)
  if raise_on_invalid
    TypeChecker.raise_on_invalid_type(context,
                                      type: factory.value_input_type)
  else
    TypeChecker.validate_type(validatable,
                              type: factory.value_input_type,
                              context: context)
  end
end
check_values(raise_on_invalid: false) click to toggle source
# File lib/openapi3_parser/node_factory/array.rb, line 161
def check_values(raise_on_invalid: false)
  return unless factory.value_input_type

  factory.context.input.each_with_index do |value, index|
    check_field_type(Context.next_field(factory.context, index, value),
                     raise_on_invalid)
  end
end
collate_errors() click to toggle source
# File lib/openapi3_parser/node_factory/array.rb, line 152
def collate_errors
  check_values(raise_on_invalid: false)
  validate(raise_on_invalid: false)

  factory.data.each do |value|
    validatable.add_errors(value.errors) if value.respond_to?(:errors)
  end
end
run_validation() click to toggle source
# File lib/openapi3_parser/node_factory/array.rb, line 192
def run_validation
  if factory.validation.is_a?(Symbol)
    factory.send(:validation, validatable)
  else
    factory.validation&.call(validatable)
  end
end
validate(raise_on_invalid: false) click to toggle source
# File lib/openapi3_parser/node_factory/array.rb, line 181
def validate(raise_on_invalid: false)
  run_validation

  return if !raise_on_invalid || validatable.errors.empty?

  first_error = validatable.errors.first
  raise Openapi3Parser::Error::InvalidData,
        "Invalid data for #{first_error.context.location_summary}: "\
        "#{first_error.message}"
end