Module: T::Props::Utils

Defined in:
lib/types/props/utils.rb

Overview

typed: true

Class Method Summary collapse

Class Method Details

.deep_clone_object(what, freeze: false) ⇒ Object

Deep copy an object. The object must consist of Ruby primitive types and Hashes and Arrays.



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
32
33
34
35
36
# File 'lib/types/props/utils.rb', line 7

def self.deep_clone_object(what, freeze: false)
  result = case what
  when true
    true
  when false
    false
  when Symbol, NilClass, Numeric
    what
  when Array
    what.map {|v| deep_clone_object(v, freeze: freeze)}
  when Hash
    h = what.class.new
    what.each do |k, v|
      k.freeze if freeze
      h[k] = deep_clone_object(v, freeze: freeze)
    end
    h
  when Regexp
    what.dup
  else
    # Some unfortunate nastiness to get around Opus::Enum potentially not
    # being defined.
    if defined?(Opus) && defined?(Opus::Enum) && what.class == Opus::Enum
      what
    else
      what.clone
    end
  end
  freeze ? result.freeze : result
end

.merge_serialized_optional_rule(prop_rules) ⇒ Object



60
61
62
# File 'lib/types/props/utils.rb', line 60

def self.merge_serialized_optional_rule(prop_rules)
  {'_tnilable' => true}.merge(prop_rules.merge('_tnilable' => true))
end

.need_nil_read_check?(prop_rules) ⇒ Boolean

The prop_rules indicate whether we should check for reading a nil value for the prop/field. This is mostly for the compatibility check that we allow existing documents carry some nil prop/field.

Returns:



40
41
42
43
# File 'lib/types/props/utils.rb', line 40

def self.need_nil_read_check?(prop_rules)
  # . :on_load allows nil read, but we need to check for the read for future writes
  prop_rules[:optional] == :on_load || prop_rules[:raise_on_nil_write]
end

.need_nil_write_check?(prop_rules) ⇒ Boolean

The prop_rules indicate whether we should check for writing a nil value for the prop/field.

Returns:



46
47
48
# File 'lib/types/props/utils.rb', line 46

def self.need_nil_write_check?(prop_rules)
  need_nil_read_check?(prop_rules) || T::Props::Utils.required_prop?(prop_rules)
end

.optional_prop?(prop_rules) ⇒ Boolean

Returns:



55
56
57
58
# File 'lib/types/props/utils.rb', line 55

def self.optional_prop?(prop_rules)
  # Clients should never reference :_tnilable as the implementation can change.
  !!prop_rules[:_tnilable]
end

.required_prop?(prop_rules) ⇒ Boolean

Returns:



50
51
52
53
# File 'lib/types/props/utils.rb', line 50

def self.required_prop?(prop_rules)
  # Clients should never reference :_tnilable as the implementation can change.
  !prop_rules[:_tnilable]
end