Sha256: 4d9ae14880120f5356e45768b22778b2d2c1da90b109af224d79145e9dd2538b
Contents?: true
Size: 1.44 KB
Versions: 13
Compression:
Stored size: 1.44 KB
Contents
# frozen_string_literal: true module StoreModel # Allows defining Rails-like enums module Enum # Defines new enum # # @param name [String] name of the enum to define # @param values [Object] # @param kwargs [Object] 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 def define_attribute(name, mapping, default) attribute name, cast_type(mapping), default: default end def define_reader(name, mapping) define_method(name) { mapping.key(send("#{name}_value")).to_s } end def define_writer(name, mapping) type = cast_type(mapping) define_method("#{name}=") { |value| super type.cast_value(value) } end def define_predicate_methods(name, mapping) mapping.each do |label, value| define_method("#{label}?") { send(name) == mapping.key(value).to_s } end end def cast_type(mapping) StoreModel::Types::EnumType.new(mapping) end def ensure_hash(values) return values if values.is_a?(Hash) values.zip(0...values.size).to_h end end end
Version data entries
13 entries across 13 versions & 1 rubygems