class StoreModel::Types::EnumType

Implements ActiveModel::Type::Value type for handling Rails-like enums

Public Class Methods

new(mapping) click to toggle source

Initializes type for mapping

@param mapping [Hash] mapping for enum values

@return [StoreModel::Types::EnumType]

# File lib/store_model/types/enum_type.rb, line 14
def initialize(mapping)
  @mapping = mapping
end

Public Instance Methods

cast_value(value) click to toggle source

Casts value from DB or user to StoreModel::Model instance

@param value [Object] a value to cast

@return StoreModel::Model

# File lib/store_model/types/enum_type.rb, line 30
def cast_value(value)
  return if value.blank?

  case value
  when String, Symbol then cast_symbol_value(value.to_sym)
  when Integer then cast_integer_value(value)
  else
    raise StoreModel::Types::CastError,
          "failed casting #{value.inspect}, only String, Symbol or " \
          "Integer instances are allowed"
  end
end
type() click to toggle source

Returns type

@return [Symbol]

# File lib/store_model/types/enum_type.rb, line 21
def type
  :integer
end

Private Instance Methods

cast_integer_value(value) click to toggle source
# File lib/store_model/types/enum_type.rb, line 50
def cast_integer_value(value)
  raise_invalid_value!(value) unless @mapping.value?(value)
  value
end
cast_symbol_value(value) click to toggle source
# File lib/store_model/types/enum_type.rb, line 45
def cast_symbol_value(value)
  raise_invalid_value!(value) unless @mapping.key?(value.to_sym)
  @mapping[value.to_sym]
end
raise_invalid_value!(value) click to toggle source
# File lib/store_model/types/enum_type.rb, line 55
def raise_invalid_value!(value)
  raise ArgumentError, "invalid value '#{value}' is assigned"
end