diff --git a/redis/src/types.rs b/redis/src/types.rs index b74d657ae..5f99602b8 100644 --- a/redis/src/types.rs +++ b/redis/src/types.rs @@ -2,6 +2,7 @@ use std::collections::{BTreeMap, BTreeSet}; use std::convert::From; use std::default::Default; use std::error; +use std::ffi::{CString, NulError}; use std::fmt; use std::hash::{BuildHasher, Hash}; use std::io; @@ -265,6 +266,18 @@ impl From for RedisError { } } +impl From for RedisError { + fn from(err: NulError) -> RedisError { + RedisError { + repr: ErrorRepr::WithDescriptionAndDetail( + ErrorKind::TypeError, + "Value contains interior nul terminator", + err.to_string(), + ), + } + } +} + #[cfg(feature = "tls")] impl From for RedisError { fn from(err: native_tls::Error) -> RedisError { @@ -1147,6 +1160,17 @@ impl FromRedisValue for bool { } } +impl FromRedisValue for CString { + fn from_redis_value(v: &Value) -> RedisResult { + match *v { + Value::Data(ref bytes) => Ok(CString::new(bytes.clone())?), + Value::Okay => Ok(CString::new("OK")?), + Value::Status(ref val) => Ok(CString::new(val.as_bytes())?), + _ => invalid_type_error!(v, "Response type not CString compatible."), + } + } +} + impl FromRedisValue for String { fn from_redis_value(v: &Value) -> RedisResult { match *v {