redis-asio 0.1.0-alpha

Asynchronous Redis driver based on tokio
Documentation
use super::{RedisResult, RedisValue, RedisError, RedisErrorKind};


/// Internal set of types that are immediately parsed to and from RESP binary packets.
/// Represents RESP protocol: "https://redis.io/topics/protocol".
#[derive(PartialEq, Eq, Debug, Clone)]
pub enum RespInternalValue {
    Nil,
    Error(String),
    Status(String),
    Int(i64),
    BulkString(Vec<u8>),
    Array(Vec<RespInternalValue>),
}

impl RespInternalValue {
    pub fn from_redis_value(value: RedisValue) -> RespInternalValue {
        match value {
            RedisValue::Nil => RespInternalValue::Nil,
            RedisValue::Ok => RespInternalValue::Status("OK".to_string()),
            RedisValue::Status(x) => RespInternalValue::Status(x),
            RedisValue::Int(x) => RespInternalValue::Int(x),
            RedisValue::BulkString(x) => RespInternalValue::BulkString(x),
            RedisValue::Array(x) =>
                RespInternalValue::Array(
                    x.into_iter()
                        .map(|val| RespInternalValue::from_redis_value(val))
                        .collect())
        }
    }

    pub fn into_redis_value(self) -> RedisResult<RedisValue> {
        match self {
            RespInternalValue::Nil => Ok(RedisValue::Nil),
            RespInternalValue::Error(x) => Err(RedisError::new(RedisErrorKind::ReceiveError, x)),
            RespInternalValue::Status(x) => match x.as_str() {
                "OK" => Ok(RedisValue::Ok),
                _ => Ok(RedisValue::Status(x))
            },
            RespInternalValue::Int(x) => Ok(RedisValue::Int(x)),
            RespInternalValue::BulkString(x) => Ok(RedisValue::BulkString(x)),
            RespInternalValue::Array(x) => {
                let mut res: Vec<RedisValue> = Vec::with_capacity(x.len());
                for val in x.into_iter() {
                    res.push(val.into_redis_value()?);
                }
                Ok(RedisValue::Array(res))
            }
        }
    }
}