use kevy_embedded::KevyError;
use kevy_resp::Reply;
pub(crate) fn vec2(verb: &[u8], a: &[u8]) -> Vec<Vec<u8>> {
vec![verb.to_vec(), a.to_vec()]
}
pub(crate) fn vec3(verb: &[u8], a: &[u8], b: &[u8]) -> Vec<Vec<u8>> {
vec![verb.to_vec(), a.to_vec(), b.to_vec()]
}
pub(crate) fn string(b: Vec<u8>) -> String {
String::from_utf8_lossy(&b).into_owned()
}
pub(crate) fn unexpected(r: Reply) -> KevyError {
let kind = match r {
Reply::Simple(_) => "simple-string",
Reply::Error(_) => "error",
Reply::Int(_) => "integer",
Reply::Bulk(_) => "bulk-string",
Reply::Nil | Reply::Null => "nil",
Reply::Array(_) => "array",
Reply::Map(_) => "map",
Reply::Set(_) => "set",
Reply::Double(_) => "double",
Reply::Boolean(_) => "boolean",
Reply::Verbatim { .. } => "verbatim-string",
Reply::BigNumber(_) => "big-number",
Reply::Push(_) => "push",
Reply::BlobError(_) => "blob-error",
};
KevyError::Protocol(format!("unexpected RESP reply variant: {kind}"))
}
pub(crate) fn array_to_bulks(items: Vec<Reply>) -> Result<Vec<Vec<u8>>, KevyError> {
items
.into_iter()
.map(|r| match r {
Reply::Bulk(v) | Reply::Simple(v) => Ok(v),
Reply::Nil => Ok(Vec::new()),
other => Err(unexpected(other)),
})
.collect()
}
pub(crate) fn store_err(e: kevy_embedded::StoreError) -> KevyError {
KevyError::Store(e)
}
pub(crate) fn num_f64(b: &[u8]) -> Result<f64, KevyError> {
let s = std::str::from_utf8(b)
.map_err(|_| KevyError::Protocol("non-utf8 number reply".into()))?;
s.parse()
.map_err(|_| KevyError::Protocol(format!("bad float reply: {s}")))
}
pub(crate) fn num_u64(b: &[u8]) -> Result<u64, KevyError> {
let s = std::str::from_utf8(b)
.map_err(|_| KevyError::Protocol("non-utf8 number reply".into()))?;
s.parse()
.map_err(|_| KevyError::Protocol(format!("bad integer reply: {s}")))
}