use redis::{aio::ConnectionLike, from_redis_value, FromRedisValue, Pipeline, RedisResult, Value};
pub async fn vec_from_redis_pipe<C: ConnectionLike, T: FromRedisValue>(
conn: &mut C,
pipe: &Pipeline,
) -> RedisResult<Vec<T>> {
let values: Vec<Value> = pipe.query_async(conn).await?;
let mut results = Vec::with_capacity(values.len());
for v in values {
results.push(from_redis_value::<T>(&v)?);
}
Ok(results)
}
#[macro_export]
macro_rules! transaction_async {
($conn:expr, $keys:expr, $body:expr) => {
loop {
redis::cmd("WATCH").arg($keys).query_async($conn).await?;
if let Some(response) = $body {
redis::cmd("UNWATCH").query_async($conn).await?;
break response;
}
}
};
}