Sha256: 14266572b3fa6e509719d36675541730e11bbd5c631ddcefb9a3af445eba3b43

Contents?: true

Size: 1.27 KB

Versions: 2

Compression:

Stored size: 1.27 KB

Contents

module Dry::Initializer
  class Option < Attribute
    # part of __initializer__ definition
    def initializer_signature
      "**__options__"
    end

    # parts of __initalizer__
    def presetter
      "@#{target} = Dry::Initializer::UNDEFINED" if dispensable?
    end

    def safe_setter
      "@#{target} = #{safe_coerced}#{maybe_optional}"
    end

    def fast_setter
      return safe_setter unless dispensable?
      "@#{target} = __options__.key?(:'#{source}') ? #{safe_coerced} : " \
      "Dry::Initializer::UNDEFINED"
    end

    # part of __defaults__
    def default_hash
      super :option
    end

    # part of __coercers__
    def coercer_hash
      super :option
    end

    private

    def dispensable?
      optional && !default
    end

    def maybe_optional
      " if __options__.key? :'#{source}'" if dispensable?
    end

    def safe_coerced
      return safe_default unless coercer
      "__coercers__[:'option_#{source}'].call(#{safe_default})"
    end

    def safe_default
      "__options__.fetch(:'#{source}')#{default_part}"
    end

    def default_part
      if default
        " { instance_eval(&__defaults__[:'option_#{source}']) }"
      elsif !optional
        " { raise ArgumentError, \"option :'#{source}' is required\" }"
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
dry-initializer-1.1.2 lib/dry/initializer/option.rb
dry-initializer-1.1.1 lib/dry/initializer/option.rb