21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
# File 'lib/rschema_hamster/hamster_ext.rb', line 21
def schema_walk(value, mapper)
fixed_size = (self.size != 1)
if value == Hamster::EmptyList and !fixed_size
value
elsif not value.is_a?(Hamster::Cons)
RSchema::ErrorDetails.new(value, 'is not a Hamster List')
elsif fixed_size && value.size != self.size
RSchema::ErrorDetails.new(value, "does not have #{self.size} elements")
else
result = Hamster.list
failure = nil
value.each.with_index do |subvalue, idx|
subschema = (fixed_size ? self[idx] : first)
subvalue_walked, error = RSchema.walk(subschema, subvalue, mapper)
if error
error.extend_key_path(idx)
failure = error
break
else
result = result.cons(subvalue_walked)
end
end
return (failure or result.reverse)
end
end
|