Class: Structor::Node

Inherits:
Object
  • Object
show all
Defined in:
lib/structor/node.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(type, required, &block) ⇒ Node

Returns a new instance of Node.



7
8
9
10
11
12
# File 'lib/structor/node.rb', line 7

def initialize(type, required, &block)
  @type = Type.new(type)
  @required = required
  @children = block_given? ? Builder.new(&block).nodes : []
  @errors = []
end

Instance Attribute Details

#requiredObject (readonly)

Returns the value of attribute required.



5
6
7
# File 'lib/structor/node.rb', line 5

def required
  @required
end

Instance Method Details

#check(structure) ⇒ Object



14
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/structor/node.rb', line 14

def check(structure)
  clear_errors

  if @type.check(structure)
    if @children.any? && structure.is_a?(Hash)
      key_set = structure.keys.to_set

      unless required_keys <= key_set
        @errors << "missing keys: #{(required_keys - key_set).to_a}"
      end

      unless key_set <= permitted_keys
        @errors << "excess keys: #{(key_set - permitted_keys).to_a}"
      end

      structure.each { |k, v| @children[k] && @children[k].check(v) }
    end
  else
    @errors << "invalid type: expected #{@type.describe}, "\
      "got #{structure.class.name}"
  end

  errors.empty?
end

#clear_errorsObject



45
46
47
48
# File 'lib/structor/node.rb', line 45

def clear_errors
  @errors.clear
  @children.each { |k, v| v.clear_errors }
end

#errorsObject



39
40
41
42
43
# File 'lib/structor/node.rb', line 39

def errors
  @errors + @children.map do |key, node|
    node.errors.map { |e| "#{key.inspect} => #{e}" }
  end.flatten
end