Class: Optimistic::Json::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/optimistic/json/parser.rb

Overview

The main parser class

Defined Under Namespace

Classes: InvalidToken, MissingParser

Constant Summary collapse

TOKENS =
{
  space: [" ", "\t", "\r", "\n"],
  array: ["["],
  object: ["{"],
  number: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"],
  string: ['"'],
  true: ["t"],
  false: ["f"],
  null: ["n"]
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(logger: nil) ⇒ Parser

: (?logger: Logger?) -> void



49
50
51
52
# File 'lib/optimistic/json/parser.rb', line 49

def initialize(logger: nil)
  @logger = logger || ::Logger.new($stdout)
  @parsers = setup_parsers
end

Instance Attribute Details

#loggerObject

: Logger



44
45
46
# File 'lib/optimistic/json/parser.rb', line 44

def logger
  @logger
end

#parsersObject (readonly)

: Hash[String, Method]



46
47
48
# File 'lib/optimistic/json/parser.rb', line 46

def parsers
  @parsers
end

Instance Method Details

#handle_remaining_tokens(tokens, data, remaining_tokens) ⇒ Object

: (String tokens, untyped data, String remaining_tokens) -> void



70
71
72
# File 'lib/optimistic/json/parser.rb', line 70

def handle_remaining_tokens(tokens, data, remaining_tokens)
  logger.info({ tokens: tokens, data: data, remaining_tokens: remaining_tokens })
end

#parse(tokens) ⇒ Object

: (String tokens) -> untyped



55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/optimistic/json/parser.rb', line 55

def parse(tokens)
  ::MultiJson.load(tokens)
rescue ::MultiJson::ParseError => e
  result = parse_any(tokens, e)

  if result[:remainder].length.positive?
    logger.warn("Unable to parse the following JSON: #{result[:remainder]}")

    handle_remaining_tokens(tokens, result[:data], result[:remainder])
  end

  result[:data]
end