Deseresp

Build status Crates.io

Deser-RESP is an implementation of serializer and deserializer for Redis's RESP3 format using serde framework.

Example

Simple usage:

```rust let buf = deseresp::to_vec(&(42, "the Answer")).unwrap();

assert_eq!(&buf, b"*2\r\n:42\r\n+the Answer\r\n");

let source: (usize, &str) = deseresp::fromslice(&buf).unwrap(); asserteq!(source, (42, "the Answer")); ```

Serialize/Deserialize specific RESP's types with:
BlobError: ```rust use deseresp::types::borrowed::BlobError;

let buf = deseresp::to_vec(&(42, BlobError::from("the Answer"))).unwrap();

assert_eq!(&buf, b"*2\r\n:42\r\n!10\r\nthe Answer\r\n");

let source: (usize, BlobError) = deseresp::fromslice(&buf).unwrap(); asserteq!(source, (42, BlobError::from("the Answer"))); ```

Push: ```rust use deseresp::types::Push;

let buf = deseresp::to_vec(&Push(("message", "channel", "data"))).unwrap();

assert_eq!(&buf, b">3\r\n+message\r\n+channel\r\n+data\r\n");

let source: Push<(&str, &str, &str)> = deseresp::fromslice(&buf).unwrap(); asserteq!(source.into_inner(), ("message", "channel", "data")); ```

Attribute: ```rust use deseresp::types::WithAttribute; use serde::{Deserialize, Serialize};

[derive(Serialize, Deserialize, PartialEq, Debug)]

struct TtlMeta { ttl: usize } let valwithattr = WithAttribute::new(TtlMeta { ttl: 3600}, 200); let buf = deseresp::tovec(&valwith_attr).unwrap();

assert_eq!(&buf, b"|1\r\n+ttl\r\n:3600\r\n:200\r\n");

let source: WithAttribute = deseresp::fromslice(&buf).unwrap(); asserteq!(source.into_inner(), (TtlMeta { ttl: 3600 }, 200)); ```

Advance usage, zero-copy network parsing:

```rust use bytes::{BytesMut, BufMut, Buf}; use serde::Deserialize;

let mut bytesmut = BytesMut::new(); // loop { // read from network bytesmut.put(&b"*2\r\n:42\r\n+the Answer\r\n"[..]); let mut d = deseresp::Deserializer::fromslice(&bytesmut); let r: (usize, &str) = Deserialize::deserialize(&mut d).unwrap(); // do something with r asserteq!(r, (42, "the Answer")); let consumedbytes = d.getconsumedbytes(); // advance bytesmut bytesmut.advance(consumed_bytes); } ```