File: parser.rb

package info (click to toggle)
ruby-toml-rb 4.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,864 kB
  • sloc: ruby: 1,398; makefile: 6
file content (47 lines) | stat: -rw-r--r-- 1,440 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
module TomlRB
  class Parser
    attr_reader :hash

    def initialize(content, symbolize_keys: false)
      @hash = {}
      @visited_keys = []
      @fully_defined_keys = []
      @current = @hash
      @symbolize_keys = symbolize_keys

      begin
        parsed = TomlRB::Document.parse(content)
        parsed.matches.map(&:value).compact.each { |m| m.accept_visitor(self) }
      rescue Citrus::ParseError => e
        raise TomlRB::ParseError.new(e.message)
      rescue Encoding::CompatibilityError => e
        raise TomlRB::ParseError.new("Encoding error: #{e.message}")
      rescue ArgumentError => e
        if e.message.include?("invalid byte sequence") || e.message.include?("encoding")
          raise TomlRB::ParseError.new("Encoding error: #{e.message}")
        else
          raise
        end
      end
    end

    # Read about the Visitor pattern
    # http://en.wikipedia.org/wiki/Visitor_pattern
    def visit_table_array(table_array)
      @fully_defined_keys = []
      table_array_key = table_array.full_key
      @visited_keys.reject! { |k| k.start_with? table_array_key }

      @current = table_array.navigate_keys @hash, @symbolize_keys
    end

    def visit_table(table)
      @fully_defined_keys = []
      @current = table.navigate_keys @hash, @visited_keys, @symbolize_keys
    end

    def visit_keyvalue(keyvalue)
      keyvalue.assign @current, @fully_defined_keys, @symbolize_keys
    end
  end
end