Module: Explicit::Spec::Hash

Extended by:
Hash
Included in:
Hash
Defined in:
lib/explicit/spec/hash.rb

Instance Method Summary collapse

Instance Method Details

#build(keyspec, valuespec, options) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/explicit/spec/hash.rb', line 6

def build(keyspec, valuespec, options)
  keyspec_validator = Explicit::Spec.build(keyspec)
  valuespec_validator = Explicit::Spec.build(valuespec)

  lambda do |value|
    return [:error, :hash] if !value.is_a?(::Hash)
    return [:error, :empty] if value.empty? && !options[:empty]

    validated_hash = {}

    value.each do |key, value|
      case [keyspec_validator.call(key), valuespec_validator.call(value)]
      in [[:ok, validated_key], [:ok, validated_value]]
        validated_hash[validated_key] = validated_value
      in [[:error, err], _]
        return [:error, [:hash_key, key, err]]
      in [_, [:error, err]]
        return [:error, [:hash_value, key, err]]
      end
    end

    [:ok, validated_hash]
  end
end