Last active
September 12, 2015 02:44
-
-
Save ka8725/21df3336b2e5d9e0c2b3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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