Sha256: 05abe8aefe750c705c108d8cd8c08385008eb8fb5d7767419c050fbb2cd6e42b

Contents?: true

Size: 1.94 KB

Versions: 286

Compression:

Stored size: 1.94 KB

Contents

# frozen_string_literal: true
# typed: true

module T::Props::Utils
  # Deep copy an object. The object must consist of Ruby primitive
  # types and Hashes and Arrays.
  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

  # 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.
  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

  # The prop_rules indicate whether we should check for writing a nil value for the prop/field.
  def self.need_nil_write_check?(prop_rules)
    need_nil_read_check?(prop_rules) || T::Props::Utils.required_prop?(prop_rules)
  end

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

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

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

Version data entries

286 entries across 286 versions & 1 rubygems

Version Path
sorbet-runtime-0.4.4369 lib/types/props/utils.rb
sorbet-runtime-0.4.4368 lib/types/props/utils.rb
sorbet-runtime-0.4.4367 lib/types/props/utils.rb
sorbet-runtime-0.4.4366 lib/types/props/utils.rb
sorbet-runtime-0.4.4365 lib/types/props/utils.rb
sorbet-runtime-0.4.4364 lib/types/props/utils.rb
sorbet-runtime-0.4.4363 lib/types/props/utils.rb
sorbet-runtime-0.4.4362 lib/types/props/utils.rb
sorbet-runtime-0.4.4361 lib/types/props/utils.rb
sorbet-runtime-0.4.4359 lib/types/props/utils.rb
sorbet-runtime-0.4.4358 lib/types/props/utils.rb
sorbet-runtime-0.4.4357 lib/types/props/utils.rb
sorbet-runtime-0.4.4356 lib/types/props/utils.rb
sorbet-runtime-0.4.4355 lib/types/props/utils.rb
sorbet-runtime-0.4.4354 lib/types/props/utils.rb
sorbet-runtime-0.4.4353 lib/types/props/utils.rb
sorbet-runtime-0.4.4352 lib/types/props/utils.rb
sorbet-runtime-0.4.4351 lib/types/props/utils.rb
sorbet-runtime-0.4.4350 lib/types/props/utils.rb
sorbet-runtime-0.4.4349 lib/types/props/utils.rb