Class: Low::TypeExpression

Inherits:
Expressions::Expression
  • Object
show all
Defined in:
lib/expressions/type_expression.rb

Overview

Represent types and default values as a series of chainable expressions.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(type: nil, default_value: :LOW_TYPE_UNDEFINED) ⇒ TypeExpression

Returns a new instance of TypeExpression.

Parameters:

  • type (defaults to: nil)
    • A literal type or an instance representation of a typed structure.



21
22
23
24
25
26
27
# File 'lib/expressions/type_expression.rb', line 21

def initialize(type: nil, default_value: :LOW_TYPE_UNDEFINED)
  @types = []
  @types << type unless type.nil?
  @default_value = default_value
  # TODO: Override per type expression with a config expression.
  @deep_type_check = nil
end

Instance Attribute Details

#default_valueObject (readonly)

Returns the value of attribute default_value.



18
19
20
# File 'lib/expressions/type_expression.rb', line 18

def default_value
  @default_value
end

#typesObject (readonly)

Returns the value of attribute types.



18
19
20
# File 'lib/expressions/type_expression.rb', line 18

def types
  @types
end

Instance Method Details

#required?Boolean

Returns:

  • (Boolean)


29
30
31
# File 'lib/expressions/type_expression.rb', line 29

def required?
  @default_value == :LOW_TYPE_UNDEFINED
end

#valid_typesObject



50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/expressions/type_expression.rb', line 50

def valid_types
  types = @types.map do |type|
    if type.is_a?(Array)
      "[#{type.map { |subtype| valid_subtype(subtype:) }.join(', ')}]"
    else
      type.inspect.to_s.delete_prefix('Low::Types::')
    end
  end

  types << 'nil' if @default_value.nil?
  types.join(' | ')
end

#validate!(value:, proxy:) ⇒ Object

rubocop:disable Metrics



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/expressions/type_expression.rb', line 33

def validate!(value:, proxy:) # rubocop:disable Metrics
  if value.nil?
    return true if @default_value.nil?
    raise proxy.error_type, proxy.error_message(value:) if required?
  end

  @types.each do |type|
    return true if type_matches_value?(type:, value:, proxy:)
    return true if type.is_a?(Array) && value.is_a?(Array) && array_types_match_values?(types: type, values: value, proxy:)
    return true if type.is_a?(Hash) && value.is_a?(Hash) && hash_types_match_values?(types: type, values: value)
  end

  raise proxy.error_type, proxy.error_message(value:)
rescue proxy.error_type => e
  raise proxy.error_type, e.message, proxy.backtrace(backtrace: e.backtrace, hidden_paths: HIDDEN_PATHS)
end