Class: ParamsReady::Parameter::Parameter

Inherits:
AbstractParameter show all
Defined in:
lib/params_ready/parameter/parameter.rb

Instance Attribute Summary

Attributes inherited from AbstractParameter

#definition

Instance Method Summary collapse

Methods inherited from AbstractParameter

#==, #dup, #inspect, intent_for_children, #match?, #populate, #to_hash, #update_if_applicable, #update_in

Methods included from Extensions::Freezer

#freeze_variable, #freeze_variables, #variables_to_freeze

Methods included from FromHash

#set_from_hash

Constructor Details

#initialize(definition) ⇒ Parameter

Returns a new instance of Parameter.



216
217
218
219
# File 'lib/params_ready/parameter/parameter.rb', line 216

def initialize(definition)
  @value = Extensions::Undefined
  super definition
end

Instance Method Details

#allows_undefined?Boolean

Returns:

  • (Boolean)


280
281
282
283
284
# File 'lib/params_ready/parameter/parameter.rb', line 280

def allows_undefined?
  return true if optional?

  !default_defined?
end

#definite_default?Boolean

Returns:

  • (Boolean)


247
248
249
# File 'lib/params_ready/parameter/parameter.rb', line 247

def definite_default?
  default_defined? && !default.nil?
end

#eligible_for_output?(intent) ⇒ Boolean

Returns:

  • (Boolean)


286
287
288
# File 'lib/params_ready/parameter/parameter.rb', line 286

def eligible_for_output?(intent)
  intent.preserve?(self)
end

#find_in_hash(hash, context) ⇒ Object



364
365
366
# File 'lib/params_ready/parameter/parameter.rb', line 364

def find_in_hash(hash, context)
  Helpers::FindInHash.find_in_hash hash, hash_key(context)
end

#format(intent) ⇒ Object



313
314
315
316
317
318
319
320
# 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) ⇒ Object



308
309
310
311
# File 'lib/params_ready/parameter/parameter.rb', line 308

def format_self_permitted(intent)
  intent = intent_for_children(intent)
  format(intent)
end

#freezeObject



383
384
385
386
387
388
389
# File 'lib/params_ready/parameter/parameter.rb', line 383

def freeze
  if definition.memoize? and !frozen?
    @memo = Helpers::Memo.new(definition.memoize)
  end
  init_for_read true
  super
end

#hashObject



391
392
393
# File 'lib/params_ready/parameter/parameter.rb', line 391

def hash
  [definition, @value].hash
end

#hash_key(format) ⇒ Object



290
291
292
# File 'lib/params_ready/parameter/parameter.rb', line 290

def hash_key(format)
  format.hash_key(self)
end

#inspect_contentObject



377
378
379
# File 'lib/params_ready/parameter/parameter.rb', line 377

def inspect_content
  @value.inspect
end

#is_default?Boolean

Returns:

  • (Boolean)


262
263
264
265
266
# 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?Boolean

Returns:

  • (Boolean)


255
256
257
258
259
260
# 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?Boolean

Returns:

  • (Boolean)


268
269
270
271
272
273
274
# 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?Boolean

Returns:

  • (Boolean)


276
277
278
# File 'lib/params_ready/parameter/parameter.rb', line 276

def is_undefined?
  @value == Extensions::Undefined && allows_undefined?
end

#memo(intent) ⇒ Object



322
323
324
325
326
# 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) ⇒ Object



328
329
330
331
332
# 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?Boolean

Returns:

  • (Boolean)


251
252
253
# File 'lib/params_ready/parameter/parameter.rb', line 251

def nil_default?
  default_defined? && default.nil?
end

#populate_other(other) ⇒ Object

Raises:



368
369
370
371
372
373
374
375
# File 'lib/params_ready/parameter/parameter.rb', line 368

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) ⇒ Object



294
295
296
297
298
299
# 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) ⇒ Object



221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
# 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)) ⇒ Object



301
302
303
304
305
306
# 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

#unwrapObject



346
347
348
# File 'lib/params_ready/parameter/parameter.rb', line 346

def unwrap
  format(Intent.instance(:backend))
end

#unwrap_or(*args, &block) ⇒ Object



350
351
352
353
354
355
356
357
358
359
360
361
362
# File 'lib/params_ready/parameter/parameter.rb', line 350

def unwrap_or(*args, &block)
  ensure_default_present!(*args, &block)

  if is_definite?
    begin
      unwrap
    rescue StandardError => _
      supply_default(*args, &block)
    end
  else
    supply_default(*args, &block)
  end
end

#wrap_output(output, intent) ⇒ Object



334
335
336
337
338
339
340
341
342
343
344
# 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