diff options
author | Steven Barth <steven@midlink.org> | 2009-01-04 20:08:45 +0000 |
---|---|---|
committer | Steven Barth <steven@midlink.org> | 2009-01-04 20:08:45 +0000 |
commit | cc4e2d4943018e0b01c403672c919072659a83a4 (patch) | |
tree | 1d642675fee19d8add31020b16c24c5345409916 /libs/json | |
parent | bb44869de9ba8d5035d4c74e3651e911e959a863 (diff) |
Introduce active (pulling) JSON-Decoder
Diffstat (limited to 'libs/json')
-rw-r--r-- | libs/json/luasrc/json.lua | 39 |
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 |