class ParamsReady::Parameter::Parameter

Public Class Methods

new(definition) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 216
def initialize(definition)
  @value = Extensions::Undefined
  super definition
end

Public Instance Methods

allows_undefined?() click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 280
def allows_undefined?
  return true if optional?

  !default_defined?
end
definite_default?() click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 247
def definite_default?
  default_defined? && !default.nil?
end
eligible_for_output?(intent) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 286
def eligible_for_output?(intent)
  intent.preserve?(self)
end
find_in_hash(hash, context) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 360
def find_in_hash(hash, context)
  Helpers::FindInHash.find_in_hash hash, hash_key(context)
end
format(intent) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 313
def format(intent)
  value = memo(intent)
  return value if value != Extensions::Undefined

  value = marshal(intent)
  memo!(value, intent)
  value
end
format_self_permitted(intent) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 308
def format_self_permitted(intent)
  intent = intent_for_children(intent)
  format(intent)
end
freeze() click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 379
def freeze
  if definition.memoize? and !frozen?
    @memo = Helpers::Memo.new(definition.memoize)
  end
  init_for_read true
  super
end
hash() click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 387
def hash
  [definition, @value].hash
end
hash_key(format) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 290
def hash_key(format)
  format.hash_key(self)
end
inspect_content() click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 373
def inspect_content
  @value.inspect
end
is_default?() click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 262
def is_default?
  return false unless default_defined?

  @value == Extensions::Undefined || @value == default
end
is_definite?() click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 255
def is_definite?
  return true if @value != Extensions::Undefined && !@value.nil?
  return false if optional? && @value.nil?

  definite_default?
end
is_nil?() click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 268
def is_nil?
  return false if is_definite?
  return true if optional?
  return true if nil_default?

  false
end
is_undefined?() click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 276
def is_undefined?
  @value == Extensions::Undefined && allows_undefined?
end
memo(intent) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 322
def memo(intent)
  return Extensions::Undefined if @memo.nil?

  @memo.cached_value(intent)
end
memo!(value, intent) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 328
def memo!(value, intent)
  return if @memo.nil? || !frozen?

  @memo.cache_value(value, intent)
end
nil_default?() click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 251
def nil_default?
  default_defined? && default.nil?
end
populate_other(other) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 364
def populate_other(other)
  raise ParamsReadyError, "Not a matching param: #{other.class.name}" unless match? other
  return other unless is_definite?

  value = bare_value
  other.populate_with(value)
  other
end
set_from_input(input, context, validator) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 294
def set_from_input(input, context, validator)
  preprocessed = definition.preprocess(input, context, validator)
  set_value preprocessed, context, validator
  definition.postprocess(self, context, validator)
  validator
end
set_value(input, context = Format.instance(:backend), validator = nil) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 221
def set_value(input, context = Format.instance(:backend), validator = nil)
  if Extensions::Undefined.value_indefinite?(input)
    handle_indefinite_input(input, validator)
  elsif self.match? input
    @value = input.bare_value
  else
    begin
      value, validator = definition.try_canonicalize(input, context, validator)
      if validator.nil? || validator.ok?
        if Extensions::Undefined.value_indefinite?(value)
          handle_indefinite_input(value, validator)
        else
          @value = value
        end
      end
    rescue StandardError => e
      if validator.nil?
        raise e
      else
        validator.error! e
      end
    end
  end
  validator
end
to_hash_if_eligible(intent = Intent.instance(:backend)) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 301
def to_hash_if_eligible(intent = Intent.instance(:backend))
  return nil unless eligible_for_output? intent

  formatted = format_self_permitted(intent)
  wrap_output(formatted, intent)
end
unwrap() click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 346
def unwrap
  format(Intent.instance(:backend))
end
unwrap_or(default) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 350
def unwrap_or(default)
  if is_definite?
    unwrap
  else
    default
  end
rescue StandardError => _
  default
end
wrap_output(output, intent) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 334
def wrap_output(output, intent)
  name_or_path = hash_key(intent)
  if name_or_path.is_a? Array
    *path, name = name_or_path
    result = {}
    Helpers::KeyMap::Mapping::Path.store(name, output, result, path)
    result
  else
    { name_or_path => output }
  end
end

Protected Instance Methods

bare_value() click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 427
def bare_value
  init_for_read
  return @value if is_definite?

  value_missing
  nil
end
handle_indefinite_input(input, validator) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 395
def handle_indefinite_input(input, validator)
  value_missing validator
  if default_defined?
    # if value_missing doesn't crash,
    # and the parameter is optional
    # it's safe to set to nil or Extensions::Undefined
    @value = Extensions::Undefined
  elsif optional?
    # Clear possible previous state,
    # will be set to default on read
    @value = input
  else
    raise ParamsReadyError, "Unexpected state for '#{name}' in #handle_indefinite_input" if validator.ok?
  end
end
init_for_read(to_be_frozen = false) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 435
def init_for_read(to_be_frozen = false)
  return unless @value == Extensions::Undefined
  return unless default_defined?

  @value = if to_be_frozen
    definition.default
  else
    definition.duplicate_default
  end
end
init_for_write() click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 446
def init_for_write
  return if is_definite?

  if default_defined? && !default.nil?
    @value = definition.duplicate_default
  else
    init_value
  end
end
init_value() click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 456
def init_value
  # NOOP
end
nil_allowed?() click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 423
def nil_allowed?
  optional? || default_defined?
end
value_missing(validator = nil) click to toggle source
# File lib/params_ready/parameter/parameter.rb, line 411
def value_missing(validator = nil)
  if !nil_allowed?
    e = ValueMissingError.new self.name
    if validator
      validator.error!(e)
    else
      raise e
    end
  end
  validator
end