Class: Structured::Dictionary

Inherits:
Object
  • Object
show all
Includes:
Type
Defined in:
lib/structured/dictionary.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(member_klass) ⇒ Dictionary

Returns a new instance of Dictionary.



7
8
9
# File 'lib/structured/dictionary.rb', line 7

def initialize(member_klass)
  @member_klass = member_klass
end

Instance Attribute Details

#member_klassObject (readonly)

Returns the value of attribute member_klass.



5
6
7
# File 'lib/structured/dictionary.rb', line 5

def member_klass
  @member_klass
end

Class Method Details

.[](member_klass) ⇒ Object



11
12
13
# File 'lib/structured/dictionary.rb', line 11

def self.[](member_klass)
  new(member_klass)
end

Instance Method Details

#default_valueObject



43
44
45
# File 'lib/structured/dictionary.rb', line 43

def default_value
  {}.freeze
end

#format_stack_frame_element(key) ⇒ Object



39
40
41
# File 'lib/structured/dictionary.rb', line 39

def format_stack_frame_element(key)
  "[#{key}]"
end

#parse(parsed_yaml, stack:, context: nil) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/structured/dictionary.rb', line 15

def parse(parsed_yaml, stack:, context: nil)
  unless parsed_yaml.is_a?(Hash)
    raise Structured::Errors::InvalidValue.new(stack,
      "#{stack} expects a hash, but found #{parsed_yaml.class.name}")
  end

  result = {}
  errors = []
  parsed_yaml.each do |key, value|
    begin
      unless key.is_a?(::String)
        raise Structured::Errors::InvalidValue.new(stack,
          "Dictionary key #{key.inspect} is not a string")
      end
      result[key] = member_klass.parse(value, stack: stack.push(key, member_klass), context: context)
    rescue Structured::Errors::Base => exception
      errors << exception
    end
  end

  raise Structured::Errors::MultipleErrors.union(stack, errors) unless errors.empty?
  result
end

#type_nameObject



47
48
49
# File 'lib/structured/dictionary.rb', line 47

def type_name
  "Dictionary[#{member_klass.type_name}]"
end