Sha256: b5e7bea6854d8ac69bcb15b9456e9e6096c011cef2b1d95197e54d8594609d8d

Contents?: true

Size: 951 Bytes

Versions: 6

Compression:

Stored size: 951 Bytes

Contents

# frozen_string_literal: true

module Strict
  module Coercers
    class Hash
      attr_reader :key_coercer, :value_coercer

      def initialize(key_coercer = nil, value_coercer = nil)
        @key_coercer = key_coercer
        @value_coercer = value_coercer
      end

      def call(value)
        return value if value.nil? || !value.respond_to?(:to_h)

        if key_coercer && value_coercer
          coerce_keys_and_values(value.to_h)
        elsif key_coercer
          coerce_keys(value.to_h)
        elsif value_coercer
          coerce_values(value.to_h)
        else
          value.to_h
        end
      end

      private

      def coerce_keys_and_values(hash) = hash.to_h { |key, value| [key_coercer.call(key), value_coercer.call(value)] }
      def coerce_keys(hash) = hash.transform_keys { |key| key_coercer.call(key) }
      def coerce_values(hash) = hash.transform_values { |value| value_coercer.call(value) }
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
strict-1.5.0 lib/strict/coercers/hash.rb
strict-1.4.0 lib/strict/coercers/hash.rb
strict-1.3.1 lib/strict/coercers/hash.rb
strict-1.3.0 lib/strict/coercers/hash.rb
strict-1.2.0 lib/strict/coercers/hash.rb
strict-1.1.0 lib/strict/coercers/hash.rb