From: Steven Barth Date: Sun, 4 Jan 2009 20:08:45 +0000 (+0000) Subject: Introduce active (pulling) JSON-Decoder X-Git-Tag: 0.9.0~830 X-Git-Url: http://git.archive.openwrt.org/?a=commitdiff_plain;h=cc4e2d4943018e0b01c403672c919072659a83a4;p=project%2Fluci.git Introduce active (pulling) JSON-Decoder --- 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