51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
# File 'lib/rschema_hamster/hamster_ext.rb', line 51
def schema_walk(value, mapper)
return RSchema::ErrorDetails.new(value, 'is not a Hash') if not value.is_a?(Hamster::Hash)
required_keys = Set.new
all_subschemas = {}
each do |(k, subschema)|
if k.is_a?(RSchema::OptionalHashKey)
all_subschemas[k.key] = subschema
else
required_keys << k
all_subschemas[k] = subschema
end
end
= value.keys.reject{ |k| all_subschemas.has_key?(k) }
if .size > 0
return RSchema::ErrorDetails.new(value, "has extraneous keys: #{.to_a.inspect}")
end
missing_requireds = required_keys.reject{ |k| value.has_key?(k) }
if missing_requireds.size > 0
return RSchema::ErrorDetails.new(value, "is missing required keys: #{missing_requireds.to_a.inspect}")
end
value.reduce(Hamster.hash) do |accum, (k, subvalue)|
subvalue_walked, error = RSchema.walk(all_subschemas[k], subvalue, mapper)
break error.extend_key_path(k) if error
a = accum.put(k, subvalue_walked)
a
end
end
|