Sha256: 5b2407f38e813ad71381a31912f73192804ffb5acbd383b660d109225e2106f4

Contents?: true

Size: 1.49 KB

Versions: 1

Compression:

Stored size: 1.49 KB

Contents

# frozen_string_literal: true
require 'request_handler/error'
module RequestHandler
  class SchemaParser
    def initialize(schema:, schema_options: {})
      missing_arguments = []
      missing_arguments << { schema: 'is missing' } if schema.nil?
      missing_arguments << { schema_options: 'is missing' } if schema_options.nil?
      raise MissingArgumentError, missing_arguments unless missing_arguments.empty?
      raise InternalArgumentError, schema: 'must be a Schema' unless schema.is_a?(Dry::Validation::Schema)
      @schema = schema
      @schema_options = schema_options
    end

    private

    def validate_schema(data, with: schema)
      raise MissingArgumentError, data: 'is missing' if data.nil?
      validator = validate(data, schema: with)
      validation_failure?(validator)
      validator.output
    end

    def validate(data, schema:)
      if schema_options.empty?
        schema.call(data)
      else
        schema.with(schema_options).call(data)
      end
    end

    def validation_failure?(validator)
      return unless validator.failure?
      errors = validator.errors.each_with_object({}) do |(k, v), memo|
        add_note(v, k, memo)
      end
      raise SchemaValidationError, errors
    end

    def add_note(v, k, memo)
      memo[k] = if v.is_a? Array
                  v.join(' ')
                elsif v.is_a? Hash
                  v.each { |(val, key)| add_note(val, key, memo) }
                end
      memo
    end

    attr_reader :schema, :schema_options
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
request_handler-0.11.0 lib/request_handler/schema_parser.rb