Class: Kolor::Enum

Inherits:
Object
  • Object
show all
Defined in:
lib/kolor/internal/enum.rb

Direct Known Subclasses

Background, Foreground, Style, Theme

Defined Under Namespace

Classes: Background, Foreground, Style, Theme

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(value) ⇒ Enum

Initializes a new enum instance with a given value

Parameters:

  • value (Object)

    the raw value of the enum



29
30
31
# File 'lib/kolor/internal/enum.rb', line 29

def initialize(value)
  @value = value
end

Instance Attribute Details

#valueObject (readonly)

Returns the value associated with the enum entry.

Returns:

  • (Object)

    the value associated with the enum entry



24
25
26
# File 'lib/kolor/internal/enum.rb', line 24

def value
  @value
end

Class Method Details

.[](name) ⇒ Kolor::Enum?

Retrieves an enum instance by name

Parameters:

Returns:



112
113
114
# File 'lib/kolor/internal/enum.rb', line 112

def [](name)
  @registry[name.to_sym]
end

.allArray<Kolor::Enum>

Returns all registered enum instances

Returns:



127
128
129
# File 'lib/kolor/internal/enum.rb', line 127

def all
  @registry.values
end

.entry(name, value) ⇒ void

This method returns an undefined value.

Registers a new enum entry with a unique name and value

Parameters:

  • name (Symbol, String)

    symbolic name of the entry

  • value (Object)

    value of the entry

Raises:

  • (ArgumentError)

    if name or value is already registered

  • (TypeError)

    if value does not match declared type



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/kolor/internal/enum.rb', line 83

def entry(name, value)
  name = name.to_sym
  @registry ||= {}
  @values ||= {}

  if defined?(@value_type) && !value.is_a?(@value_type)
    raise TypeError, "Invalid value type for #{name}: expected #{@value_type}, got #{value.class}"
  end

  if @values.key?(value)
    existing = @values[value]
    raise ArgumentError, "Duplicate value #{value.inspect} for #{name}; already assigned to #{existing}"
  end

  if @registry.key?(name)
    raise ArgumentError, "Duplicate name #{name}; already registered with value #{@registry[name].value.inspect}"
  end

  instance = new(value)
  @registry[name] = instance
  @values[value] = name

  define_singleton_method(name) { instance }
end

.keysArray<Symbol>

Returns all registered names

Returns:

  • (Array<Symbol>)


134
135
136
# File 'lib/kolor/internal/enum.rb', line 134

def keys
  @registry.keys
end

.name_for(value) ⇒ Symbol

Resolves the symbolic name for a given value

Parameters:

  • value (Object)

Returns:

  • (Symbol)

    name or :unknown



120
121
122
# File 'lib/kolor/internal/enum.rb', line 120

def name_for(value)
  @values[value] || :unknown
end

.remove(name) ⇒ Kolor::Enum?

Removes an enum entry by name

Parameters:

Returns:



149
150
151
152
153
154
155
156
157
# File 'lib/kolor/internal/enum.rb', line 149

def remove(name)
  name = name.to_sym
  entry = @registry.delete(name)
  if entry
    @values.delete_if { |_, v| v == name }
    singleton_class.undef_method(name) if respond_to?(name)
  end
  entry
end

.type(klass) ⇒ void

This method returns an undefined value.

Declares the expected type of all enum values

Parameters:

  • klass (Class)

    the type constraint for values



72
73
74
# File 'lib/kolor/internal/enum.rb', line 72

def type(klass)
  @value_type = klass
end

.valuesArray<Object>

Returns all raw values

Returns:

  • (Array<Object>)


141
142
143
# File 'lib/kolor/internal/enum.rb', line 141

def values
  @registry.values.map(&:value)
end

Instance Method Details

#==(other) ⇒ Boolean Also known as: eql?

Equality based on class and value

Parameters:

  • other (Object)

Returns:

  • (Boolean)


52
53
54
# File 'lib/kolor/internal/enum.rb', line 52

def ==(other)
  other.is_a?(self.class) && other.value == value
end

#hashInteger

Hash code based on value

Returns:

  • (Integer)


65
# File 'lib/kolor/internal/enum.rb', line 65

def hash = value.hash

#inspectString

Returns a debug-friendly string representation

Returns:



46
# File 'lib/kolor/internal/enum.rb', line 46

def inspect  = "#<#{self.class.name} #{to_sym.inspect}:#{value.inspect}>"

#to_sString

Returns the symbolic name of the value as a string

Returns:



36
# File 'lib/kolor/internal/enum.rb', line 36

def to_s     = self.class.name_for(value).to_s

#to_symSymbol

Returns the symbolic name of the value as a symbol

Returns:

  • (Symbol)


41
# File 'lib/kolor/internal/enum.rb', line 41

def to_sym   = self.class.name_for(value)