class Dry::Initializer::Builders::Attribute

@private

Public Class Methods

[](definition) click to toggle source
# File lib/dry/initializer/builders/attribute.rb, line 8
def self.[](definition)
  new(definition).call
end
new(definition) click to toggle source
# File lib/dry/initializer/builders/attribute.rb, line 18
def initialize(definition)
  @definition = definition
  @option     = definition.option
  @type       = definition.type
  @optional   = definition.optional
  @default    = definition.default
  @source     = definition.source
  @ivar       = definition.ivar
  @null       = definition.null ? "Dry::Initializer::UNDEFINED" : "nil"
  @opts       = "__dry_initializer_options__"
  @congif     = "__dry_initializer_config__"
  @item       = "__dry_initializer_definition__"
  @val        = @option ? "__dry_initializer_value__" : @source
end

Public Instance Methods

call() click to toggle source
# File lib/dry/initializer/builders/attribute.rb, line 12
def call
  lines.compact
end

Private Instance Methods

assignment_line() click to toggle source
# File lib/dry/initializer/builders/attribute.rb, line 83
def assignment_line
  "#{@ivar} = #{@val}" \
    " unless #{@null} == #{@val} && instance_variable_defined?(:#{@ivar})"
end
coercion_line() click to toggle source
# File lib/dry/initializer/builders/attribute.rb, line 71
def coercion_line
  return unless @type

  arity = @type.is_a?(Proc) ? @type.arity : @type.method(:call).arity

  if arity.equal?(1) || arity.negative?
    "#{@val} = #{@item}.type.call(#{@val}) unless #{@null} == #{@val}"
  else
    "#{@val} = #{@item}.type.call(#{@val}, self) unless #{@null} == #{@val}"
  end
end
default_line() click to toggle source
# File lib/dry/initializer/builders/attribute.rb, line 65
def default_line
  return unless @default

  "#{@val} = instance_exec(&#{@item}.default) if #{@null} == #{@val}"
end
definition_line() click to toggle source
# File lib/dry/initializer/builders/attribute.rb, line 59
def definition_line
  return unless @type || @default

  "#{@item} = __dry_initializer_config__.definitions[:'#{@source}']"
end
lines() click to toggle source
# File lib/dry/initializer/builders/attribute.rb, line 33
def lines
  [
    "",
    definition_line,
    reader_line,
    default_line,
    coercion_line,
    assignment_line
  ]
end
optional_reader() click to toggle source
# File lib/dry/initializer/builders/attribute.rb, line 50
def optional_reader
  "#{@val} = #{@opts}.fetch(:'#{@source}', #{@null})"
end
reader_line() click to toggle source
# File lib/dry/initializer/builders/attribute.rb, line 44
def reader_line
  return unless @option

  @optional ? optional_reader : required_reader
end
required_reader() click to toggle source
# File lib/dry/initializer/builders/attribute.rb, line 54
def required_reader
  "#{@val} = #{@opts}.fetch(:'#{@source}')" \
    " { raise KeyError, \"\#{self.class}: #{@definition} is required\" }"
end