Class: TSJSON::Enum

Inherits:
Base
  • Object
show all
Defined in:
lib/types/enum.rb

Instance Method Summary collapse

Methods inherited from Base

#compile, #index, #valid?

Constructor Details

#initialize(members = {}) ⇒ Enum



3
4
5
6
7
8
# File 'lib/types/enum.rb', line 3

def initialize(members = {})
  super()

  @members = members
  @members.each { |name, type| validate_type!(type) }
end

Instance Method Details

#has?(type) ⇒ Boolean



28
29
30
# File 'lib/types/enum.rb', line 28

def has?(type)
  types.include?(type)
end

#member(name) ⇒ Object Also known as: property



10
11
12
13
14
15
# File 'lib/types/enum.rb', line 10

def member(name)
  m = @members[name]
  raise "Can't access property #{name} of #{self.class.name}" unless m

  m
end

#push_type(type) ⇒ Object



18
19
20
21
22
# File 'lib/types/enum.rb', line 18

def push_type(type)
  validate_type!(type)
  return self if types.include?(type)
  return Enum.new(@types.dup.push(type))
end

#typesObject



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

def types
  @types ||= @members.values
end

#validate(value) ⇒ Object



38
39
40
41
42
43
44
45
# File 'lib/types/enum.rb', line 38

def validate(value)
  types.each { |type| return true if type.valid?(value) }

  raise LiteralUnionValidationError.new(
          expected_values: types.map(&:value),
          received_value: value
        )
end

#validate_type!(type) ⇒ Object



32
33
34
35
36
# File 'lib/types/enum.rb', line 32

def validate_type!(type)
  unless type.is_a?(Literal)
    raise "Enum can contain only literal values received #{type.class}"
  end
end