Skip to content

Instantly share code, notes, and snippets.

@ka8725
Last active September 12, 2015 02:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ka8725/21df3336b2e5d9e0c2b3 to your computer and use it in GitHub Desktop.
Save ka8725/21df3336b2e5d9e0c2b3 to your computer and use it in GitHub Desktop.
require 'set'
class I18n
def self.t(t, options = {})
"#{t} - #{options}"
end
end
class Enum
class TokenNotFoundError < StandardError; end
class << self
def inherited(child)
return if self == Enum
child.__values__ = self.__values__.clone
end
def values(*ary)
ary.each { |val| __values__.add(val.to_s) }
end
def all
__values__
end
def token(t)
ts = t.to_s
unless __values__.include?(ts)
raise(TokenNotFoundError, "token '#{t}'' not found in the enum #{self}")
end
ts
end
def name(t)
translate(token(t))
end
protected
def __values__
@__values__ ||= Set.new
end
def __values__=(set)
@__values__ = set
end
private
def translate(token)
I18n.t(token, scope: "enum.#{self}")
end
end
end
class Side < Enum
values :left, :right, :whole
end
class SSide < Side
values :sleft
end
class T < Enum
values :a
end
puts T.all.to_a.inspect
puts Side.token(:left)
puts Side.token('right')
puts (begin Side.token(:invalid); rescue Enum::TokenNotFoundError => e; 'invalid'; end)
puts Side.all.to_a.inspect
puts Side.name(:left)
puts (begin Side.name(:invalid); rescue Enum::TokenNotFoundError => e; 'invalid'; end)
puts SSide.all.to_a.inspect
__END__
left
right
invalid
["left", "right", "whole"]
left - {:scope=>"enum.Class"}
invalid
[Finished in 0.1s]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment