Class: Decoding::Decoders::Hash

Inherits:
Decoding::Decoder show all
Defined in:
lib/decoding/decoders/hash.rb

Overview

Decode an arbitrary hash using decoders for keys and values.

See Also:

Instance Method Summary collapse

Methods inherited from Decoding::Decoder

#failure, #to_decoder

Constructor Details

#initialize(key_decoder, value_decoder) ⇒ Hash

Returns a new instance of Hash.

Parameters:



13
14
15
16
17
# File 'lib/decoding/decoders/hash.rb', line 13

def initialize(key_decoder, value_decoder)
  @key_decoder = key_decoder.to_decoder
  @value_decoder = value_decoder.to_decoder
  super()
end

Instance Method Details

#call(value) ⇒ Decoding::Result<Hash<a, b>>

Parameters:

  • value (Object)

Returns:



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/decoding/decoders/hash.rb', line 21

def call(value)
  if value.is_a?(::Hash)
    key_value_pairs = value.map do |k, v|
      all(
        [
          @key_decoder
            .call(k)
            .map_err { |e| failure("error decoding key #{k.inspect}: #{e}") },

          @value_decoder
            .call(v)
            .map_err { |e| failure("error decoding value for key #{k.inspect}: #{e}") }
        ]
      )
    end
    all(key_value_pairs).map(&:to_h)
  else
    err("expected Hash, got #{value.class}")
  end
end