# SwiftNIO Redis - Protocol Implementation

swift-nio-redis is a port of the
[Noze.io redis module](https://github.com/NozeIO/Noze.io/tree/master/Sources/redis).

The NIO implementation has been optimized for performance.

This [Noze.io](http://noze.io/) `RedisParser` stream:

```swift
let parser = RedisParser()

stream! | parser | Writable { values, done in
  handle(replies: values)
  done(nil)
}
```

This is essentially replaced by the
[RESPChannelHandler](RESPChannelHandler.swift).
Instead of piping via `|`, it can be injected into the
Swift NIO channel pipleline like so:

```swift
_ = bootstrap.channelInitializer { channel in
  channel.pipeline
    .configureRedisPipeline()
    .then {
      channel.pipeline.add(YourRedisHandler())
    }
}
```

Your handler will then receive
[RESPValue](RESPValue.swift)
enums as the "readable input",
and it can emit
[RESPEncodable](RESPEncodable.swift)
values are the "writable output".

A `RESPValue` is just an enum with the on-the-write datatypes supported
by RESP:

- `simpleString` (a `ByteBuffer`)
- `bulkString`   (a `ByteBuffer` or `nil`)
- `integer`
- `array`        (a `ContiguousArray` of `RESPValue`s)
- `error`        (an error)

The primary `RESPEncodable` is again a `RESPValue`, but
`Int`'s, `String`'s, `Data`'s etc can also be directly written
w/o having to wrap them in a `RESPValue`.

## Example

For a full example on how to use the protocol implementation,
a [Redis client module](../Redis/) is provided as part of this package.

## Telnet Mode

Besides the binary variant, the Redis protocol also supports a "Telnet mode".
A basic implementation of that is included,
the major piece lacking is quoted strings.