Class: Sequent::Core::Helpers::StringToValueParsers

Inherits:
Object
  • Object
show all
Defined in:
lib/sequent/core/helpers/string_to_value_parsers.rb

Constant Summary collapse

PARSERS =
{
  ::Symbol => ->(value) { Symbol.deserialize_from_json(value) },
  ::String => ->(value) { value&.to_s },
  ::Integer => ->(value) { parse_to_integer(value) },
  ::BigDecimal => ->(value) { parse_to_bigdecimal(value) },
  ::Float => ->(value) { parse_to_float(value) },
  ::Boolean => ->(value) { parse_to_bool(value) },
  ::Date => ->(value) { parse_to_date(value) },
  ::DateTime => ->(value) { parse_to_date_time(value) },
  ::Sequent::Core::Helpers::ArrayWithType => ->(values, type_in_array) { parse_array(values, type_in_array) },
  ::Sequent::Core::Helpers::Secret => ->(value) { Sequent::Core::Helpers::Secret.new(value).encrypt },
}

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(klass) ⇒ StringToValueParsers

Returns a new instance of StringToValueParsers.



66
67
68
69
70
71
72
73
# File 'lib/sequent/core/helpers/string_to_value_parsers.rb', line 66

def initialize(klass)
  if klass.is_a? Sequent::Core::Helpers::ArrayWithType
    @array_with_type = klass
    @klass = klass.class
  else
    @klass = klass
  end
end

Class Method Details

.for(klass) ⇒ Object



62
63
64
# File 'lib/sequent/core/helpers/string_to_value_parsers.rb', line 62

def self.for(klass)
  new(klass)
end

.parse_array(values, type_in_array) ⇒ Object



51
52
53
54
55
56
57
58
59
60
# File 'lib/sequent/core/helpers/string_to_value_parsers.rb', line 51

def self.parse_array(values, type_in_array)
  fail "invalid value for array(): \"#{values}\"" unless values.is_a?(Array)
  values.map do |item|
    if item.respond_to?(:parse_attrs_to_correct_types)
      item.parse_attrs_to_correct_types
    else
      Sequent::Core::Helpers::StringToValueParsers.for(type_in_array).parse_from_string(item)
    end
  end
end

.parse_to_bigdecimal(value) ⇒ Object



26
27
28
# File 'lib/sequent/core/helpers/string_to_value_parsers.rb', line 26

def self.parse_to_bigdecimal(value)
  BigDecimal(value) unless value.blank?
end

.parse_to_bool(value) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/sequent/core/helpers/string_to_value_parsers.rb', line 34

def self.parse_to_bool(value)
  if value.blank? && !(value.is_a?(TrueClass) || value.is_a?(FalseClass))
    nil
  else
    (value.is_a?(TrueClass) || value == "true")
  end
end

.parse_to_date(value) ⇒ Object



42
43
44
45
# File 'lib/sequent/core/helpers/string_to_value_parsers.rb', line 42

def self.parse_to_date(value)
  return if value.blank?
  value.is_a?(Date) ? value : Date.iso8601(value.dup)
end

.parse_to_date_time(value) ⇒ Object



47
48
49
# File 'lib/sequent/core/helpers/string_to_value_parsers.rb', line 47

def self.parse_to_date_time(value)
  value.is_a?(DateTime) ? value : DateTime.deserialize_from_json(value)
end

.parse_to_float(value) ⇒ Object



30
31
32
# File 'lib/sequent/core/helpers/string_to_value_parsers.rb', line 30

def self.parse_to_float(value)
  Float(value) unless value.blank?
end

.parse_to_integer(value) ⇒ Object



21
22
23
24
# File 'lib/sequent/core/helpers/string_to_value_parsers.rb', line 21

def self.parse_to_integer(value)
  return value if value.is_a?(Integer)
  Integer(value, 10) unless value.blank?
end

Instance Method Details

#parse_from_string(value) ⇒ Object



75
76
77
78
79
80
81
82
# File 'lib/sequent/core/helpers/string_to_value_parsers.rb', line 75

def parse_from_string(value)
  parser = PARSERS.fetch(@klass) { |key| fail "Unsupported value type: #{key}" }
  if @array_with_type
    parser.call(value, @array_with_type.item_type)
  else
    parser.call(value)
  end
end