kramer 3.0.0

Enumerated types implementing std::fmt::Display for sending RESP messages to redis.
Documentation
#![cfg(feature = "kramer-async")]
#![feature(test)]

extern crate async_std;
extern crate kramer;
extern crate test;

use async_std::task;
use kramer::{execute, Arity, Command, Insertion, Response, ResponseValue, SetCommand, StringCommand};
use std::env::var;
use test::Bencher;

fn get_redis_url() -> String {
  let host = var("REDIS_HOST").unwrap_or(String::from("0.0.0.0"));
  let port = var("REDIS_PORT").unwrap_or(String::from("6379"));
  format!("{}:{}", host, port)
}

#[bench]
fn bench_kramer_set_del_async(b: &mut Bencher) {
  b.iter(|| {
    task::block_on(async {
      let key = "kramer_async";
      let mut stream = async_std::net::TcpStream::connect(get_redis_url())
        .await
        .expect("connected");
      let set_cmd = StringCommand::Set(Arity::One((key, "42")), None, Insertion::Always);
      execute(&mut stream, set_cmd).await.expect("written");
      let del_cmd = Command::Del::<_, &str>(Arity::One(key));
      execute(&mut stream, del_cmd).await.expect("written");
      Ok::<(), std::io::Error>(())
    })
    .expect("ran async");
  });
}

#[bench]
fn bench_kramer_set_operations_async(b: &mut Bencher) {
  b.iter(|| {
    task::block_on(async {
      let (one, two) = ("kramer_async_set_operations_1", "kramer_async_set_operations_2");
      let mut stream = async_std::net::TcpStream::connect(get_redis_url())
        .await
        .expect("connected");

      execute(&mut stream, SetCommand::Add(one, Arity::One("jerry")))
        .await
        .expect("written");

      execute(&mut stream, SetCommand::Add(one, Arity::One("kramer")))
        .await
        .expect("written");

      execute(&mut stream, SetCommand::Add(one, Arity::One("george")))
        .await
        .expect("written");

      execute(&mut stream, SetCommand::Add(two, Arity::One("kramer")))
        .await
        .expect("written");

      let result = execute(&mut stream, SetCommand::Inter::<_, &str>(Arity::Many(vec![one, two])))
        .await
        .expect("written");

      assert_eq!(
        result,
        Response::Array(vec![ResponseValue::String(String::from("kramer"))])
      );

      execute(&mut stream, Command::Del::<_, &str>(Arity::Many(vec![one, two])))
        .await
        .expect("written");
      Ok::<(), std::io::Error>(())
    })
    .expect("ran async");
  });
}