Sha256: c7ed5e83287a4b3e16d573f907b4d286700f50080ab9e3f2e8ef2f447f38ab0b

Contents?: true

Size: 1.06 KB

Versions: 3

Compression:

Stored size: 1.06 KB

Contents

# frozen_string_literal: true

require "active_support/core_ext/object/inclusion"

class Kredis::Types::Enum < Kredis::Types::Proxying
  prepend Kredis::DefaultValues

  InvalidDefault = Class.new(StandardError)

  proxying :set, :get, :del, :exists?, :multi

  attr_accessor :values

  def initialize(...)
    super
    define_predicates_for_values
  end

  def value=(value)
    if validated_choice = value.presence_in(values)
      set validated_choice
    end
  end

  def value
    get
  end

  def reset
    multi do
      del
      set_default
    end
  end

  private
    def define_predicates_for_values
      values.each do |defined_value|
        define_singleton_method("#{defined_value}?") { value == defined_value }
        define_singleton_method("#{defined_value}!") { self.value = defined_value }
      end
    end

    def set_default
      if default.in?(values) || default.nil?
        set default
      else
        raise InvalidDefault, "Default value #{default.inspect} for #{key} is not a valid option (Valid values: #{values.join(", ")})"
      end
    end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
kredis-1.7.0 lib/kredis/types/enum.rb
kredis-1.6.1 lib/kredis/types/enum.rb
kredis-1.6.0 lib/kredis/types/enum.rb