summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSteven Barth <steven@midlink.org>2009-01-04 20:08:45 +0000
committerSteven Barth <steven@midlink.org>2009-01-04 20:08:45 +0000
commitcc4e2d4943018e0b01c403672c919072659a83a4 (patch)
tree1d642675fee19d8add31020b16c24c5345409916
parentbb44869de9ba8d5035d4c74e3651e911e959a863 (diff)
Introduce active (pulling) JSON-Decoder
-rw-r--r--libs/json/luasrc/json.lua39
1 files changed, 38 insertions, 1 deletions
diff --git a/libs/json/luasrc/json.lua b/libs/json/luasrc/json.lua
index 5d1abcf48..26b540428 100644
--- a/libs/json/luasrc/json.lua
+++ b/libs/json/luasrc/json.lua
@@ -498,4 +498,41 @@ Decoder.parsers = {
['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