Class: Hamster::Cons

Inherits:
Object
  • Object
show all
Defined in:
lib/rschema_hamster/hamster_ext.rb

Instance Method Summary collapse

Instance Method Details

#schema_walk(value, mapper) ⇒ Object



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