Skip to content

Instantly share code, notes, and snippets.

@asterite
Last active August 29, 2015 14:08
Show Gist options
  • Select an option

  • Save asterite/31bff1851ad397719e69 to your computer and use it in GitHub Desktop.

Select an option

Save asterite/31bff1851ad397719e69 to your computer and use it in GitHub Desktop.
struct Enum
include Comparable(self)
macro def to_s(io : IO) : Nil
{% if @enum_flags %}
found = false
{% for member in @enum_members %}
if value & {{member}}.value != 0
io << ", " if found
io << {{member.stringify}}
found = true
end
{% end %}
io << name unless found
{% else %}
io << to_s
{% end %}
nil
end
macro def to_s : String
{% if @enum_flags %}
String.build { |io| to_s(io) }
{% else %}
name
{% end %}
end
macro def name : String
case value
{% for member in @enum_members %}
when {{member}}.value
{{member.stringify}}
{% end %}
else
value.to_s
end
end
def +(other : Int)
self.class.new(value + other)
end
def -(other : Int)
self.class.new(value - other)
end
def |(other : self)
self.class.new(value | other.value)
end
def &(other : self)
self.class.new(value & other.value)
end
def ^(other : self)
self.class.new(value ^ other.value)
end
def ~(other : self)
self.class.new(value ~ other.value)
end
def <(other : self)
value < other.value
end
def includes?(other : self)
(value & other.value) != 0
end
def <=>(other : self)
value <=> other.value
end
macro def self.names : Array(String)
{{ @enum_members.map &.stringify }}
end
macro def self.values : Array(self)
{{ @enum_members }}
end
macro def self.to_h : Hash(String, self)
{
{% for member in @enum_members %}
{{member.stringify}} => {{member}},
{% end %}
}
end
def self.parse(string)
value = parse?(string)
if value
value
else
raise "Uknonwn enum #{self} value: #{string}"
end
end
macro def self.parse?(string) : self ?
case string.downcase
{% for member in @enum_members %}
when {{member.stringify.downcase}}
{{member}}
{% end %}
else
nil
end
end
def self.each
to_h.each do |key, value|
yield key, value
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment