Class Decoder

decode redis values from stream of ubyte chunks

class Decoder ;

Methods

NameDescription
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");