Class: JSONSEQ::Reader

Inherits:
Object
  • Object
show all
Defined in:
lib/jsonseq/reader.rb

Defined Under Namespace

Classes: EndOfFile, JSONObject, MaybeTruncated, ParsingError

Constant Summary collapse

DEFAULT_DECODER =
-> (string) { JSON.parse(string) }

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(io:, decoder: DEFAULT_DECODER) ⇒ Reader



39
40
41
42
# File 'lib/jsonseq/reader.rb', line 39

def initialize(io:, decoder: DEFAULT_DECODER)
  @io = io
  @decoder = decoder
end

Instance Attribute Details

#decoderObject (readonly)

Returns the value of attribute decoder.



37
38
39
# File 'lib/jsonseq/reader.rb', line 37

def decoder
  @decoder
end

#ioObject (readonly)

Returns the value of attribute io.



36
37
38
# File 'lib/jsonseq/reader.rb', line 36

def io
  @io
end

Instance Method Details

#decode_string(string) ⇒ Object



106
107
108
109
110
# File 'lib/jsonseq/reader.rb', line 106

def decode_string(string)
  decoder[string]
rescue => exn
  ParsingError.new(source: string, exception: exn)
end

#eachObject



69
70
71
72
73
74
75
76
77
78
79
# File 'lib/jsonseq/reader.rb', line 69

def each
  if block_given?
    while true
      object = read
      yield object
      return if object.is_a?(EndOfFile)
    end
  else
    enum_for :each
  end
end

#each_objectObject



93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/jsonseq/reader.rb', line 93

def each_object
  if block_given?
    each do |value|
      case value
      when JSONObject
        yield value.object
      end
    end
  else
    enum_for :each_object
  end
end

#readObject



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/jsonseq/reader.rb', line 44

def read
  # @type var source: String
  begin
    source = io.readline(RS).chomp(RS)
  end while source == ""

  object = decode_string(source)

  case object
  when Numeric, TrueClass, FalseClass, nil
    if truncated?(source)
      MaybeTruncated.new(source: source, object: object)
    else
      JSONObject.new(object: object)
    end
  when ParsingError
    object
  else
    JSONObject.new(object: object)
  end
rescue EOFError
  EndOfFile.new
end

#read_objectObject



81
82
83
84
85
86
87
88
89
90
91
# File 'lib/jsonseq/reader.rb', line 81

def read_object
  value = read
  case value
  when MaybeTruncated, ParsingError
    read_object
  when EndOfFile
    nil
  when JSONObject
    value.object
  end
end

#truncated?(string) ⇒ Boolean



112
113
114
# File 'lib/jsonseq/reader.rb', line 112

def truncated?(string)
  !string.end_with?(LF, "\x20", "\x09", "\x0d")
end