Class: Skit::Serialization::Processor::Hash

Inherits:
Base
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/skit/serialization/processor/hash.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(type_spec, registry:) ⇒ Hash

Returns a new instance of Hash.



16
17
18
19
20
21
22
23
24
# File 'lib/skit/serialization/processor/hash.rb', line 16

def initialize(type_spec, registry:)
  super
  unless type_spec.is_a?(T::Types::TypedHash)
    raise ArgumentError, "Expected T::Types::TypedHash, got #{type_spec.class}"
  end

  @key_type = T.let(extract_raw_key_type(type_spec.keys), T.untyped)
  @value_type = T.let(type_spec.values, T.untyped)
end

Class Method Details

.handles?(type_spec) ⇒ Boolean

Returns:



11
12
13
# File 'lib/skit/serialization/processor/hash.rb', line 11

def self.handles?(type_spec)
  type_spec.is_a?(T::Types::TypedHash)
end

Instance Method Details

#deserialize(value, path: Path.new) ⇒ Object

Raises:



39
40
41
42
43
44
45
46
47
48
49
# File 'lib/skit/serialization/processor/hash.rb', line 39

def deserialize(value, path: Path.new)
  raise DeserializeError.new("Expected Hash, got #{value.class}", path: path) unless value.is_a?(::Hash)

  result = T.let({}, T::Hash[T.untyped, T.untyped])
  value.each do |key, item|
    normalized_key = normalize_key(key)
    processor = @registry.processor_for(@value_type)
    result[normalized_key] = processor.deserialize(item, path: path.append(key.to_s))
  end
  result
end

#serialize(value, path: Path.new) ⇒ Object

Raises:



27
28
29
30
31
32
33
34
35
36
# File 'lib/skit/serialization/processor/hash.rb', line 27

def serialize(value, path: Path.new)
  raise SerializeError.new("Expected Hash, got #{value.class}", path: path) unless value.is_a?(::Hash)

  result = T.let({}, T::Hash[::String, T.untyped])
  value.each do |key, item|
    processor = @registry.processor_for(@value_type)
    result[key.to_s] = processor.serialize(item, path: path.append(key.to_s))
  end
  result
end

#traverse(value, path: Path.new, &blk) ⇒ Object



58
59
60
61
62
63
64
65
66
67
# File 'lib/skit/serialization/processor/hash.rb', line 58

def traverse(value, path: Path.new, &blk)
  super

  return unless value.is_a?(::Hash)

  value.each do |key, val|
    processor = @registry.processor_for(@value_type)
    processor.traverse(val, path: path.append(key.to_s), &blk)
  end
end