deserializeRespType function

Future<RespType> deserializeRespType(
  1. StreamReader streamReader
)

Implementation

Future<RespType> deserializeRespType(StreamReader streamReader) async {
  final typePrefix = await streamReader.takeOne();
  switch (typePrefix) {
    case 0x2b: // simple string
      final payload = utf8.decode(await streamReader.takeWhile((data) => data != 0x0d));
      await streamReader.takeCount(2);
      return RespSimpleString(payload);
    case 0x2d: // error
      final payload = utf8.decode(await streamReader.takeWhile((data) => data != 0x0d));
      await streamReader.takeCount(2);
      return RespError(payload);
    case 0x3a: // integer
      final payload = int.parse(utf8.decode(await streamReader.takeWhile((data) => data != 0x0d)));
      await streamReader.takeCount(2);
      return RespInteger(payload);
    case 0x24: // bulk string
      final length = int.parse(utf8.decode(await streamReader.takeWhile((data) => data != 0x0d)));
      await streamReader.takeCount(2);
      if (length == -1) {
        return RespBulkString(null);
      }
      final payload = utf8.decode(await streamReader.takeCount(length));
      await streamReader.takeCount(2);
      return RespBulkString(payload);
    case 0x2a: // array
      final count = int.parse(utf8.decode(await streamReader.takeWhile((data) => data != 0x0d)));
      await streamReader.takeCount(2);
      if (count == -1) {
        return RespArray(null);
      }
      final elements = <RespType>[];
      for (var i = 0; i < count; i++) {
        elements.add(await deserializeRespType(streamReader));
      }
      return RespArray(elements);
    default:
      throw StateError('unexpected character: $typePrefix');
  }
}