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

Version Path
store_model-0.11.1 lib/store_model/enum.rb
store_model-0.11.0 lib/store_model/enum.rb
store_model-0.10.0 lib/store_model/enum.rb
store_model-0.9.0 lib/store_model/enum.rb
store_model-0.8.2 lib/store_model/enum.rb
store_model-0.8.1 lib/store_model/enum.rb
store_model-0.8.0 lib/store_model/enum.rb
store_model-0.7.0 lib/store_model/enum.rb
store_model-0.6.2 lib/store_model/enum.rb
store_model-0.6.1 lib/store_model/enum.rb
store_model-0.6.0 lib/store_model/enum.rb
store_model-0.5.3 lib/store_model/enum.rb
store_model-0.5.2 lib/store_model/enum.rb