Module: Keycase::RecursiveTransform::Engine

Defined in:
lib/keycase/recursive_transform/engine.rb

Class Method Summary collapse

Class Method Details

.transform_array(array, visiting, depth, max_depth, &key_converter) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/keycase/recursive_transform/engine.rb', line 38

def transform_array(array, visiting, depth, max_depth, &key_converter)
  check_depth!(depth, max_depth)

  oid = array.object_id
  raise CircularStructureError, "Keycase detected a circular reference in an Array" if visiting.include?(oid)

  visiting.add(oid)
  begin
    array.map do |element|
      transform_value(
        element,
        visiting,
        depth + 1,
        max_depth,
        &key_converter
      )
    end
  ensure
    visiting.delete(oid)
  end
end

.transform_hash(hash, visiting, depth, max_depth, &key_converter) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/keycase/recursive_transform/engine.rb', line 9

def transform_hash(hash, visiting, depth, max_depth, &key_converter)
  check_depth!(depth, max_depth)

  oid = hash.object_id
  raise CircularStructureError, "Keycase detected a circular reference in a Hash" if visiting.include?(oid)

  visiting.add(oid)
  begin
    hash.each_with_object({}) do |(key, value), memo|
      new_key = key_converter.call(key)
      if memo.key?(new_key)
        message = "Keycase detected a key collision: #{key.inspect} converted to " \
                  "#{new_key.inspect}, which already exists in the transformed hash"
        raise KeyCollisionError, message
      end

      memo[new_key] = transform_value(
        value,
        visiting,
        depth + 1,
        max_depth,
        &key_converter
      )
    end
  ensure
    visiting.delete(oid)
  end
end

.transform_value(value, visiting, depth, max_depth, &key_converter) ⇒ Object



60
61
62
63
64
65
66
67
68
69
# File 'lib/keycase/recursive_transform/engine.rb', line 60

def transform_value(value, visiting, depth, max_depth, &key_converter)
  case value
  when Hash
    transform_hash(value, visiting, depth, max_depth, &key_converter)
  when Array
    transform_array(value, visiting, depth, max_depth, &key_converter)
  else
    value
  end
end