···1515 class ArgumentError < ::ArgumentError
1616 include Error
1717 end
1818+1919+ def self.Enum(type, &block)
2020+ Enum.define(type, &block)
2121+ end
2222+2323+ def self.Value(type, &block)
2424+ Value.define(type, &block)
2525+ end
1826end
+1-1
lib/literal/enum.rb
···1717 @members.each(&block)
1818 end
19192020- def define(&block)
2020+ def define(type, &block)
2121 Class.new(self, &block).freeze
2222 end
2323
+4-1
lib/literal/value.rb
···2929 end
30303131 value_class.class_exec(&block) if block
3232- value_class.freeze
3332 value_class
3433 end
3534 end
···4241 end
43424443 attr_reader :value
4444+4545+ def inspect
4646+ "#{self.class.name}(#{value.inspect})"
4747+ end
4548end
···11# frozen_string_literal: true
2233-Color = Literal::Enum.define do
33+Color = Literal::Enum(String) do
44 Red("#ff0000")
55 Green("#00ff00")
66 Blue("#0000ff")
-20
test/literal/struct.rb
···11-# frozen_string_literal: true
22-33-class Person < Literal::Struct
44- attribute :name, String
55- attribute :age, Integer
66-end
77-88-test do
99- expect {
1010- Person.new(name: "John", age: 42)
1111- }.not_to_raise
1212-end
1313-1414-test do
1515- expect {
1616- Person.new(name: 1, age: "Hello")
1717- }.to_raise(Literal::TypeError) do |error|
1818- expect(error.message) == "Expected name: `1` to be: `String`."
1919- end
2020-end
+89
test/literal/value.rb
···11+let def type = Literal::Value(Integer)
22+let def example = type.new(1)
33+44+context "with Integer" do
55+ let def type = Literal::Value(Integer)
66+ let def example = type.new(1)
77+88+ test "invalid type" do
99+ expect { type.new(1.0) }.to_raise(Literal::TypeError)
1010+ end
1111+1212+ test do
1313+ expect(example.value) == 1
1414+ expect(example.to_i) == 1
1515+ end
1616+end
1717+1818+context "with String" do
1919+ let def type = Literal::Value(String)
2020+ let def example = type.new("foo")
2121+2222+ test do
2323+ expect(example.value) == "foo"
2424+ expect(example.to_s) == "foo"
2525+ expect(example.to_str) == "foo"
2626+ end
2727+end
2828+2929+context "with Symbol" do
3030+ let def type = Literal::Value(Symbol)
3131+ let def example = type.new(:foo)
3232+3333+ test do
3434+ expect(example.value) == :foo
3535+ expect(example.to_sym) == :foo
3636+ end
3737+end
3838+3939+context "with Float" do
4040+ let def type = Literal::Value(Float)
4141+ let def example = type.new(1.0)
4242+4343+ test do
4444+ expect(example.value) == 1.0
4545+ expect(example.to_f) == 1.0
4646+ end
4747+end
4848+4949+context "with Set" do
5050+ let def type = Literal::Value(Set)
5151+ let def example = type.new(Set[1, 2, 3])
5252+5353+ test do
5454+ expect(example.value) == Set[1, 2, 3]
5555+ expect(example.to_set) == Set[1, 2, 3]
5656+ end
5757+end
5858+5959+context "with Array" do
6060+ let def type = Literal::Value(Array)
6161+ let def example = type.new([1, 2, 3])
6262+6363+ test do
6464+ expect(example.value) == [1, 2, 3]
6565+ expect(example.to_a) == [1, 2, 3]
6666+ expect(example.to_ary) == [1, 2, 3]
6767+ end
6868+end
6969+7070+context "with Hash" do
7171+ let def type = Literal::Value(Hash)
7272+ let def example = type.new({ foo: :bar })
7373+7474+ test do
7575+ expect(example.value) == { foo: :bar }
7676+ expect(example.to_h) == { foo: :bar }
7777+ end
7878+end
7979+8080+context "with Proc" do
8181+ let def type = Literal::Value(Proc)
8282+ let def value = -> { :foo }
8383+ let def example = type.new(value)
8484+8585+ test do
8686+ expect(example.value) == value
8787+ expect(example.to_proc) == value
8888+ end
8989+end