use crate::ValkeyFuture;
use crate::pipeline::Pipeline;
use crate::value::FromValkeyValue;
use crate::value::ValkeyValue;
#[doc(hidden)]
#[sealed::sealed(pub(crate))]
pub trait PipelineDispatch {
#[doc(hidden)]
fn glide_dispatch_pipeline<'a>(&self, pipeline: &'a Pipeline) -> ValkeyFuture<'a, ValkeyValue>;
}
pub trait PipelineExt {
fn query_async<'a, T: FromValkeyValue + Send + 'a>(
&'a self,
con: &impl PipelineDispatch,
) -> ValkeyFuture<'a, T>;
fn exec_async<'a>(&'a self, con: &impl PipelineDispatch) -> ValkeyFuture<'a, ()> {
self.query_async(con)
}
}
impl PipelineExt for Pipeline {
fn query_async<'a, T: FromValkeyValue + Send + 'a>(
&'a self,
con: &impl PipelineDispatch,
) -> ValkeyFuture<'a, T> {
let reply = con.glide_dispatch_pipeline(self);
Box::pin(async move {
let value = match reply.await? {
ValkeyValue::Array(items) => {
let ignored = self.as_redis().ignored_commands();
ValkeyValue::Array(
items
.into_iter()
.enumerate()
.filter_map(|(i, v)| (!ignored.contains(&i)).then_some(v))
.collect(),
)
}
ValkeyValue::Nil => ValkeyValue::Nil,
other => unreachable!("unexpected pipeline reply from Valkey: {other:?}"),
};
T::from_owned_valkey_value(value)
})
}
}