Class Decoder
decode redis values from stream of ubyte chunks
class Decoder
;
Methods
Name | Description |
---|---|
get
|
try to fetch decoded value from decoder. Return next value or value of type Incomplete. |
put
|
put next data chunk to decoder |
Example
globalLogLevel = LogLevel .info;
RedisdValue str = {_type:ValueType .String, _svar : "abc"};
RedisdValue err = {_type:ValueType .Error, _svar : "err"};
auto b = redisdValue(1001) .encode
~ redisdValue(1002) .encode
~ str .encode
~ err .encode
~ redisdValue("\r\nBulkString\r\n") .encode
~ redisdValue(1002) .encode
~ redisdValue([1,2,3]) .encode
~ redisdValue(["abc", "def"]) .encode
~ redisdValue(1002) .encode;
foreach(chunkSize; 1..b .length) {
auto s = new Decoder();
foreach (c; b .chunks(chunkSize)) {
s .put(c);
}
auto v = s .get();
assert(v ._ivar == 1001);
v = s .get();
assert(v ._ivar == 1002);
v = s .get();
assert(v ._svar == "abc");
v = s .get();
assert(v ._svar == "err");
v = s .get();
assert(v ._svar == "\r\nBulkString\r\n");
v = s .get();
assert(v ._ivar == 1002);
int lists_to_get = 2;
while( lists_to_get>0 ) {
v = s .get();
debug (redisd)
() @trusted { tracef("%s: %s, %s", v ._type, v, lists_to_get); }();
if (v ._type == ValueType .List) {
lists_to_get--;
}
}
v = s .get();
assert(v ._ivar == 1002);
v = s .get();
assert(v ._type == ValueType .Incomplete);
}
info("test ok");