Sha256: eef15fc703e6e5e855b9462e3c264cee8318b8081032b777e4ecb9f4f6320a72

Contents?: true

Size: 940 Bytes

Versions: 3

Compression:

Stored size: 940 Bytes

Contents

#
# Prepares the `:default` option
#
# It must respond to `.call` without arguments
#
module Dry::Initializer::Dispatchers::PrepareDefault
  extend self

  def call(default: nil, optional: nil, **options)
    default = callable! default
    check_arity! default

    { default: default, optional: (optional | default), **options }
  end

  private

  def callable!(default)
    return unless default
    return default if default.respond_to?(:call)
    return callable(default.to_proc) if default.respond_to?(:to_proc)

    invalid!(default)
  end

  def check_arity!(default)
    return unless default

    arity = default.method(:call).arity.to_i
    return unless arity.positive?

    invalid!(default)
  end

  def invalid!(default)
    raise TypeError, "The #{default.inspect} should be" \
                     " either convertable to proc with no arguments," \
                     " or respond to #call without arguments."
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
dry-initializer-3.0.2 lib/dry/initializer/dispatchers/prepare_default.rb
dry-initializer-3.0.1 lib/dry/initializer/dispatchers/prepare_default.rb
dry-initializer-3.0.0 lib/dry/initializer/dispatchers/prepare_default.rb