class Enummer::EnummerType

Public Class Methods

new(value_names:) click to toggle source

@param [Array<Symbol>] value_names list of all possible values for this type

# File lib/enummer/enummer_type.rb, line 8
def initialize(value_names:)
  @value_names = value_names
  @bit_pairs = determine_bit_pairs(value_names)
end

Public Instance Methods

deserialize(value) click to toggle source

@param [Numeric] value Numeric representation of values @return [Array<Symbol>] Current value represented as symbols

# File lib/enummer/enummer_type.rb, line 30
def deserialize(value)
  return [] unless value
  return [] if value.to_i.zero?

  @bit_pairs.each_with_object([]) do |(pair_name, pair_value), value_names|
    next if (value & pair_value).zero?

    value_names << pair_name
  end
end
serialize(value) click to toggle source

@param [Symbol|Array<Symbol>] value Current value represented as one or more symbols @return Numeric Numeric representation of values

# File lib/enummer/enummer_type.rb, line 22
def serialize(value)
  return unless value

  Array.wrap(value).sum { |value_name| @bit_pairs.fetch(value_name.to_sym, 0) }
end
type() click to toggle source

@return Symbol Representation of this type @example

:enummer[read|write|execute]
# File lib/enummer/enummer_type.rb, line 16
def type
  "enummer[#{@value_names.join("|")}]".to_sym
end

Private Instance Methods

determine_bit_pairs(value_names) click to toggle source
# File lib/enummer/enummer_type.rb, line 43
def determine_bit_pairs(value_names)
  value_names.map.with_index do |name, shift|
    [name, 1 << shift]
  end.to_h
end