class Object

Constants

DEFAULT_ENUM_BASE_INDEX

Country # <struct CustomStruct index=1, display=“中华人民共和国”, short_name=“中国”>

Public Instance Methods

def_enum(module_name, enum_hash, enum_base: DEFAULT_ENUM_BASE_INDEX, symbol_name: :symbol, index_name: :index, display_name: :display) click to toggle source
# File lib/def_enum_helper.rb, line 58
def def_enum(module_name, enum_hash, enum_base: DEFAULT_ENUM_BASE_INDEX,
             symbol_name: :symbol, index_name: :index, display_name: :display)
  temp_struct = Struct.new(symbol_name, index_name, display_name)
  new_enum_hash = {}
  enum_hash.each do |k, v|
    new_enum_hash[k] = temp_struct.new(k, 0, v)
  end
  def_enum_struct(module_name, new_enum_hash,
                  enum_base: enum_base, symbol_name: symbol_name,
                  index_name: index_name, display_name: display_name)
end
def_enum_struct(module_name, enum_hash, enum_base: DEFAULT_ENUM_BASE_INDEX, symbol_name: :symbol, index_name: :index, display_name: :display) click to toggle source
# File lib/def_enum_helper.rb, line 70
def def_enum_struct(module_name, enum_hash, enum_base: DEFAULT_ENUM_BASE_INDEX,
                    symbol_name: :symbol, index_name: :index, display_name: :display)
  i = 0
  set_index = (index_name.to_s + '=').to_sym
  enum_hash.each do |_k, v|
    enum_value = enum_base + i
    v.public_send(set_index, enum_value)
    i += 1
  end

  def_enum_struct_with_index(module_name, enum_hash,
                             symbol_name: symbol_name, index_name: index_name,
                             display_name: display_name)
end
def_enum_struct_with_index(module_name, enum_hash, symbol_name: :symbol, index_name: :index, display_name: :display) click to toggle source
# File lib/def_enum_helper.rb, line 147
def def_enum_struct_with_index(module_name, enum_hash, symbol_name: :symbol,
                               index_name: :index, display_name: :display)
  m = Module.new
  enum_index_hash = {}
  enum_display_hash = {}
  i = 0
  enum_hash.each do |k, v|
    v.define_singleton_method(symbol_name) { k } unless v.respond_to?(symbol_name)

    enum_value = v.public_send(index_name)
    m.const_set(k, enum_value)
    enum_index_hash[enum_value] = v
    enum_display_hash[v.public_send(display_name)] = v
    i += 1
  end

  define_enum_methods(m, enum_index_hash, enum_display_hash)

  if is_a?(Module)
    const_set(module_name, m)
  else
    Kernel.const_set(module_name, m)
  end
end
def_enum_with_index(module_name, *value_array, symbol_name: :symbol, index_name: :index, display_name: :display) click to toggle source
# File lib/def_enum_helper.rb, line 85
def def_enum_with_index(module_name, *value_array,
                        symbol_name: :symbol, index_name: :index, display_name: :display)
  h = {}
  temp_struct = Struct.new(symbol_name, index_name, display_name)
  value_array.each do |variable|
    h[variable[0]] = temp_struct.new(variable[0], variable[1], variable[2])
  end

  def_enum_struct_with_index(module_name, h, symbol_name: symbol_name,
                                             index_name: index_name, display_name: display_name)
end
define_convert_methods(m, enum_index_hash) click to toggle source
# File lib/def_enum_helper.rb, line 127
def define_convert_methods(m, enum_index_hash)
  m.define_singleton_method(:to_hash_array) { enum_index_hash.each_value.map(&:to_h) }

  m.define_singleton_method(:to_json_array) { to_hash_array.to_json }
end
define_enum_methods(m, enum_index_hash, enum_display_hash) click to toggle source
# File lib/def_enum_helper.rb, line 133
def define_enum_methods(m, enum_index_hash, enum_display_hash)
  define_iterator_methods(m, enum_index_hash)

  m.define_singleton_method(:include?) { |n| n.is_a?(Symbol) ? constants.include?(n) : enum_index_hash.key?(n) }

  m.define_singleton_method(:member?) { |n| include?(n) }

  m.define_singleton_method(:count) { enum_index_hash.count }

  define_convert_methods(m, enum_index_hash)

  define_subscript_method(m, enum_index_hash, enum_display_hash)
end
define_iterator_methods(m, enum_index_hash) click to toggle source
# File lib/def_enum_helper.rb, line 97
def define_iterator_methods(m, enum_index_hash)
  m.define_singleton_method(:each) { |&blk| enum_index_hash.each_value { |v| blk.call(v) } }
  m.define_singleton_method(:map) { |&blk| enum_index_hash.values.map { |v| blk.call(v) } }

  m.define_singleton_method(:all) { enum_index_hash.values }
  m.define_singleton_method(:keys) { m.constants }
  m.define_singleton_method(:indexes) { enum_index_hash.keys }
end
define_subscript_method(m, enum_index_hash, enum_display_hash) click to toggle source
# File lib/def_enum_helper.rb, line 106
def define_subscript_method(m, enum_index_hash, enum_display_hash)
  divisor = enum_index_hash.count

  m.define_singleton_method(:[]) do |k|
    case k
    when String
      enum_display_hash[k]
    when Symbol
      index =
        if is_a?(Module)
          const_get(k)
        else
          Kernel.const_get(k)
        end
      enum_index_hash[index]
    else
      enum_index_hash[k]
    end
  end
end