Sha256: deefc32c1232d07a0abb23bf6b42c18a9a8ee2767c0b6ca927a63a2e38585d27

Contents?: true

Size: 1.49 KB

Versions: 4

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

4 entries across 4 versions & 1 rubygems

Version Path
request_handler-0.15.0 lib/request_handler/schema_parser.rb
request_handler-0.14.0 lib/request_handler/schema_parser.rb
request_handler-0.13.0 lib/request_handler/schema_parser.rb
request_handler-0.12.0 lib/request_handler/schema_parser.rb