2016-02-27 12:09:50 +00:00
|
|
|
# NimYAML - YAML implementation in Nim
|
|
|
|
# (c) Copyright 2015 Felix Krause
|
|
|
|
#
|
|
|
|
# See the file "copying.txt", included in this
|
|
|
|
# distribution, for details about the copyright.
|
|
|
|
|
2016-08-10 18:42:44 +00:00
|
|
|
type IteratorYamlStream = ref object of YamlStream
|
|
|
|
backend: iterator(): YamlStreamEvent
|
|
|
|
|
2016-02-12 18:53:25 +00:00
|
|
|
proc initYamlStream*(backend: iterator(): YamlStreamEvent): YamlStream =
|
2016-08-10 18:42:44 +00:00
|
|
|
result = new(IteratorYamlStream)
|
2016-04-02 15:48:22 +00:00
|
|
|
result.peeked = false
|
2016-08-10 18:42:44 +00:00
|
|
|
result.isFinished = false
|
|
|
|
IteratorYamlStream(result).backend = backend
|
|
|
|
result.nextImpl = proc(s: YamlStream, e: var YamlStreamEvent): bool =
|
|
|
|
e = IteratorYamlStream(s).backend()
|
|
|
|
if finished(IteratorYamlStream(s).backend):
|
|
|
|
s.isFinished = true
|
|
|
|
result = false
|
|
|
|
else: result = true
|
2016-02-12 18:53:25 +00:00
|
|
|
|
2016-08-10 18:42:44 +00:00
|
|
|
proc next*(s: YamlStream): YamlStreamEvent =
|
|
|
|
yAssert(not s.isFinished)
|
2016-04-02 15:48:22 +00:00
|
|
|
if s.peeked:
|
|
|
|
s.peeked = false
|
|
|
|
shallowCopy(result, s.cached)
|
|
|
|
else:
|
|
|
|
try:
|
2016-08-10 18:42:44 +00:00
|
|
|
while true:
|
|
|
|
if s.nextImpl(s, result): break
|
|
|
|
yAssert(not s.isFinished)
|
2016-04-02 15:48:22 +00:00
|
|
|
except YamlStreamError:
|
|
|
|
let cur = getCurrentException()
|
|
|
|
var e = newException(YamlStreamError, cur.msg)
|
|
|
|
e.parent = cur.parent
|
|
|
|
raise e
|
|
|
|
except Exception:
|
|
|
|
let cur = getCurrentException()
|
|
|
|
var e = newException(YamlStreamError, cur.msg)
|
|
|
|
e.parent = cur
|
|
|
|
raise e
|
2016-02-12 18:53:25 +00:00
|
|
|
|
2016-08-10 18:42:44 +00:00
|
|
|
proc peek*(s: YamlStream): YamlStreamEvent =
|
2016-04-02 15:48:22 +00:00
|
|
|
if not s.peeked:
|
|
|
|
s.cached = s.next()
|
|
|
|
s.peeked = true
|
|
|
|
shallowCopy(result, s.cached)
|
2016-02-12 18:53:25 +00:00
|
|
|
|
2016-08-10 18:42:44 +00:00
|
|
|
proc `peek=`*(s: YamlStream, value: YamlStreamEvent) =
|
2016-04-02 15:48:22 +00:00
|
|
|
s.cached = value
|
|
|
|
s.peeked = true
|
2016-02-12 18:53:25 +00:00
|
|
|
|
2016-08-10 18:42:44 +00:00
|
|
|
proc finished*(s: YamlStream): bool =
|
2016-04-02 15:48:22 +00:00
|
|
|
if s.peeked: result = false
|
|
|
|
else:
|
|
|
|
try:
|
2016-08-10 18:42:44 +00:00
|
|
|
while true:
|
|
|
|
if s.isFinished: return true
|
|
|
|
if s.nextImpl(s, s.cached):
|
|
|
|
s.peeked = true
|
|
|
|
return false
|
2016-04-02 15:48:22 +00:00
|
|
|
except YamlStreamError:
|
|
|
|
let cur = getCurrentException()
|
|
|
|
var e = newException(YamlStreamError, cur.msg)
|
|
|
|
e.parent = cur.parent
|
|
|
|
raise e
|
|
|
|
except Exception:
|
|
|
|
let cur = getCurrentException()
|
|
|
|
echo cur.getStackTrace()
|
|
|
|
var e = newException(YamlStreamError, cur.msg)
|
|
|
|
e.parent = cur
|
|
|
|
raise e
|