Module: Depth::Actions

Included in:
ComplexHash
Defined in:
lib/depth/actions.rb

Instance Method Summary collapse

Instance Method Details

#alter(route, key: nil, value: nil) ⇒ Object



24
25
26
27
28
29
30
31
32
33
# File 'lib/depth/actions.rb', line 24

def alter(route, key: nil, value: nil)
  return set(route, value) if key == nil
  route = RouteElement.convert_route(route)
  value = find(route) unless value
  new_route = (route[0 ... -1] << RouteElement.convert(key))
  set(new_route, value) # ensure it exists
  old_key = route.last.key
  return unless old_key != key
  delete(route)
end

#baseObject

:nocov:

Raises:

  • (NoMethodError)


4
5
6
# File 'lib/depth/actions.rb', line 4

def base
  raise NoMethodError.new('should be overridden')
end

#delete(route) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
# File 'lib/depth/actions.rb', line 35

def delete(route)
  route = RouteElement.convert_route(route)
  traverser = route[0...-1].reduce(Traverser.new(base)) do |t, route_el|
    t.next(route_el.key)
  end
  if traverser.array?
    traverser.object.delete_at(route.last.key)
  elsif traverser.hash?
    traverser.object.delete(route.last.key)
  end
end

#find(route) ⇒ Object



17
18
19
20
21
22
# File 'lib/depth/actions.rb', line 17

def find(route)
  route = RouteElement.convert_route(route)
  route.reduce(Traverser.new(base)) { |t, route_el|
    t.next(route_el.key)
  }.object
end

#set(route, value) ⇒ Object

:nocov:



9
10
11
12
13
14
15
# File 'lib/depth/actions.rb', line 9

def set(route, value)
  route = RouteElement.convert_route(route)
  object = route[0 ... -1].reduce(Traverser.new(base)) { |t, route_el|
    t.next_or_create(route_el.key) { route_el.create }
  }.object
  object[route.last.key] = value
end