Introduce active (pulling) JSON-Decoder
authorSteven Barth <steven@midlink.org>
Sun, 4 Jan 2009 20:09:13 +0000 (20:09 +0000)
committerSteven Barth <steven@midlink.org>
Sun, 4 Jan 2009 20:09:13 +0000 (20:09 +0000)
libs/json/luasrc/json.lua

index 5d1abcf..26b5404 100644 (file)
@@ -498,4 +498,41 @@ Decoder.parsers = {
        ['n'] = Decoder.parse_null,
        ['['] = Decoder.parse_array,
        ['{'] = Decoder.parse_object
        ['n'] = Decoder.parse_null,
        ['['] = Decoder.parse_array,
        ['{'] = Decoder.parse_object
-}
\ No newline at end of file
+}
+
+
+--- Create a new Active JSON-Decoder.
+-- @class      function
+-- @name       ActiveDecoder
+-- @param   customnull Use luci.json.null instead of nil for decoding null
+-- @return  Active JSON-Decoder
+ActiveDecoder = util.class(Decoder)
+
+function ActiveDecoder.__init__(self, source, customnull)
+       Decoder.__init__(self, customnull)
+       self.source = source
+       self.chunk = nil
+       getmetatable(self).__call = self.get
+end
+
+
+--- Fetches one JSON-object from given source
+-- @return Decoded object
+function ActiveDecoder.get(self)
+       local chunk, src_err, object
+       if not self.chunk then
+               chunk, src_err = self.source()
+       else
+               chunk = self.chunk
+       end
+
+       self.chunk, object = self:dispatch(chunk, src_err, true)
+       return object
+end
+
+
+function ActiveDecoder.fetch(self)
+       local chunk, src_err = self.source()
+       assert(chunk or not src_err, src_err)
+       return chunk
+end