module StoreModel::Enum

Allows defining Rails-like enums

Public Instance Methods

enum(name, values = nil, **kwargs) click to toggle source

Defines new enum

@param name [String] name of the enum to define @param values [Object] @param kwargs [Object]

# File lib/store_model/enum.rb, line 11
def enum(name, values = nil, **kwargs)
  values ||= kwargs[:in] || kwargs

  ensure_hash(values).tap do |mapping|
    define_attribute(name, mapping, kwargs[:default])
    define_reader(name, mapping)
    define_writer(name, mapping)
    define_method("#{name}_value") { attributes[name.to_s] }
    define_method("#{name}_values") { mapping }
    define_predicate_methods(name, mapping)
  end
end

Private Instance Methods

cast_type(mapping) click to toggle source
# File lib/store_model/enum.rb, line 45
def cast_type(mapping)
  StoreModel::Types::EnumType.new(mapping)
end
define_attribute(name, mapping, default) click to toggle source
# File lib/store_model/enum.rb, line 26
def define_attribute(name, mapping, default)
  attribute name, cast_type(mapping), default: default
end
define_predicate_methods(name, mapping) click to toggle source
# File lib/store_model/enum.rb, line 39
def define_predicate_methods(name, mapping)
  mapping.each do |label, value|
    define_method("#{label}?") { send(name) == mapping.key(value).to_s }
  end
end
define_reader(name, mapping) click to toggle source
# File lib/store_model/enum.rb, line 30
def define_reader(name, mapping)
  define_method(name) { mapping.key(send("#{name}_value")).to_s }
end
define_writer(name, mapping) click to toggle source
Calls superclass method
# File lib/store_model/enum.rb, line 34
def define_writer(name, mapping)
  type = cast_type(mapping)
  define_method("#{name}=") { |value| super type.cast_value(value) }
end
ensure_hash(values) click to toggle source
# File lib/store_model/enum.rb, line 49
def ensure_hash(values)
  return values if values.is_a?(Hash)

  values.zip(0...values.size).to_h
end