Module: Zui::Value

Defined in:
lib/zui/value.rb

Constant Summary collapse

MAX_DEPTH =
32
MAX_ITEMS =
10_000

Class Method Summary collapse

Class Method Details

.guard_cycle(value, property, seen) ⇒ Object



33
34
35
36
37
38
39
40
# File 'lib/zui/value.rb', line 33

def guard_cycle(value, property, seen)
  identity = value.object_id
  raise ArgumentError, "cyclic property value: #{property}" if seen[identity]
  seen[identity] = true
  yield
ensure
  seen.delete(identity)
end

.normalize(value, property: nil, depth: 0, seen: {}, count: [0]) ⇒ Object

Raises:

  • (ArgumentError)


7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/zui/value.rb', line 7

def normalize(value, property: nil, depth: 0, seen: {}, count: [0])
  raise ArgumentError, "property value exceeds #{MAX_DEPTH} levels: #{property}" if depth > MAX_DEPTH
  count[0] += 1
  raise ArgumentError, "property value exceeds #{MAX_ITEMS} items: #{property}" if count[0] > MAX_ITEMS

  case value
  when Symbol then value.to_s
  when String, TrueClass, FalseClass, NilClass, Integer then value
  when Float
    raise ArgumentError, "property number must be finite: #{property}" unless value.finite?
    value
  when Array
    guard_cycle(value, property, seen) do
      value.map { |item| normalize(item, property:, depth: depth + 1, seen:, count:) }
    end
  when Hash
    guard_cycle(value, property, seen) do
      value.each_with_object({}) do |(key, item), result|
        result[key.to_s] = normalize(item, property:, depth: depth + 1, seen:, count:)
      end
    end
  else
    raise ArgumentError, "unsupported property value for #{property}: #{value.class}"
  end
end