242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
|
# File 'lib/rschema.rb', line 242
def schema_walk(value, mapper)
return RSchema::ErrorDetails.new('is not a Hash') if not value.is_a?(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({"has extraneous keys" => })
end
missing_requireds = required_keys.reject{ |k| value.has_key?(k) }
if missing_requireds.size > 0
return RSchema::ErrorDetails.new({"is missing required keys" => missing_requireds})
end
value.reduce({}) do |accum, (k, subvalue)|
subvalue_walked, error = RSchema.walk(all_subschemas[k], subvalue, mapper)
break RSchema::ErrorDetails.new({ k => error.details }) if error
accum[k] = subvalue_walked
accum
end
end
|