private static byte[] ReadBulkStringValue(RespReader reader) { RespDataType dataType = reader.ReadDataType(); if (dataType == RespDataType.Error) { string err = reader.ReadErrorValue(); throw new RedisErrorException(err); } if (dataType != RespDataType.BulkString) { throw new InvalidDataException(); } return(reader.ReadBulkStringValue()); }
private static long ReadIntegerValue(RespReader reader) { RespDataType dataType = reader.ReadDataType(); if (dataType == RespDataType.Error) { string err = reader.ReadErrorValue(); throw new RedisErrorException(err); } if (dataType != RespDataType.Integer) { throw new InvalidDataException(); } return(reader.ReadIntegerValue()); }
protected override CommandResult <byte[]> ReadResult(IRespReader reader) { RespDataType dataType = reader.ReadDataType(); if (dataType == RespDataType.Error) { string err = reader.ReadErrorValue(); return(CommandResult <byte[]> .Error(err)); } if (dataType != RespDataType.BulkString) { throw new InvalidDataException(); } byte[] value = reader.ReadBulkStringValue(); return(CommandResult.Success(value)); }
protected override CommandResult <long> ReadResult(IRespReader reader) { RespDataType dataType = reader.ReadDataType(); if (dataType == RespDataType.Error) { string err = reader.ReadErrorValue(); return(CommandResult <long> .Error(err)); } if (dataType != RespDataType.Integer) { throw new InvalidDataException(); } long value = reader.ReadIntegerValue(); return(CommandResult.Success(value)); }
private static IList <byte[]> ReadArrayOfBulkStrings(RespReader reader) { RespDataType dataType = reader.ReadDataType(); if (dataType == RespDataType.Error) { string err = reader.ReadErrorValue(); throw new RedisErrorException(err); } if (dataType != RespDataType.Array) { throw new InvalidDataException(); } if (!reader.TryReadStartArray(out long length)) { return(null); } var values = new List <byte[]>(); for (var i = 0; i < length; i++) { dataType = reader.ReadDataType(); if (dataType != RespDataType.BulkString) { throw new InvalidDataException(); } byte[] value = reader.ReadBulkStringValue(); values.Add(value); } return(values); }
protected override CommandResult <IList <byte[]> > ReadResult(IRespReader reader) { RespDataType dataType = reader.ReadDataType(); if (dataType == RespDataType.Error) { string err = reader.ReadErrorValue(); return(CommandResult <IList <byte[]> > .Error(err)); } if (dataType != RespDataType.Array) { throw new InvalidDataException(); } if (!reader.TryReadStartArray(out long length)) { return(CommandResult <IList <byte[]> > .Success(null)); } var values = new byte[length][]; for (var i = 0; i < length; i++) { dataType = reader.ReadDataType(); if (dataType != RespDataType.BulkString) { throw new InvalidDataException(); } values[i] = reader.ReadBulkStringValue(); } return(CommandResult.Success((IList <byte[]>)values)); }
private void Listen() { while (true) { ValidateNotDisposed(); RespDataType dataType = _reader.ReadDataType(); if (dataType == RespDataType.Error) { string err = _reader.ReadErrorValue(); throw new RedisErrorException(err); } if (dataType != RespDataType.Array) { throw new InvalidDataException(); } if (!_reader.TryReadStartArray(out _)) { continue; } dataType = _reader.ReadDataType(); if (dataType != RespDataType.BulkString) { throw new InvalidDataException(); } byte[] kindBytes = _reader.ReadBulkStringValue(); string kind = _encoding.GetString(kindBytes); switch (kind) { case "subscribe": { dataType = _reader.ReadDataType(); if (dataType != RespDataType.BulkString) { throw new InvalidDataException(); } byte[] channelBytes = _reader.ReadBulkStringValue(); string channel = _encoding.GetString(channelBytes); dataType = _reader.ReadDataType(); if (dataType != RespDataType.Integer) { throw new InvalidDataException(); } long count = _reader.ReadIntegerValue(); Debug.WriteLine("subscribe: {0} ({1})", channel, count); break; } case "unsubscribe": { dataType = _reader.ReadDataType(); if (dataType != RespDataType.BulkString) { throw new InvalidDataException(); } byte[] channelBytes = _reader.ReadBulkStringValue(); string channel = _encoding.GetString(channelBytes); dataType = _reader.ReadDataType(); if (dataType != RespDataType.Integer) { throw new InvalidDataException(); } long count = _reader.ReadIntegerValue(); Debug.WriteLine("unsubscribe: {0} ({1})", channel, count); break; } case "message": { dataType = _reader.ReadDataType(); if (dataType != RespDataType.BulkString) { throw new InvalidDataException(); } byte[] channelBytes = _reader.ReadBulkStringValue(); string channel = _encoding.GetString(channelBytes); dataType = _reader.ReadDataType(); if (dataType != RespDataType.BulkString) { throw new InvalidDataException(); } byte[] messageBytes = _reader.ReadBulkStringValue(); string messageString = _encoding.GetString(messageBytes); Debug.WriteLine("message from {0}: {1}", channel, messageString); break; } } } }