use crate::ValkeyFuture;
use crate::cmd::Cmd;
use crate::commands::geo::GeoCoord;
use crate::commands::geo::GeoUnit;
use crate::commands::options::CopyOptions;
use crate::commands::options::Direction;
use crate::commands::options::ExpireOption;
use crate::commands::options::Expiry;
use crate::commands::options::FlushAllOptions;
use crate::commands::options::FlushDbOptions;
use crate::commands::options::HashFieldExpirationOptions;
use crate::commands::options::LposOptions;
use crate::commands::options::SetOptions;
use crate::commands::stream::StreamAddOptions;
use crate::commands::stream::StreamAutoClaimOptions;
use crate::commands::stream::StreamAutoClaimReply;
use crate::commands::stream::StreamClaimOptions;
use crate::commands::stream::StreamClaimReply;
use crate::commands::stream::StreamInfoConsumersReply;
use crate::commands::stream::StreamInfoGroupsReply;
use crate::commands::stream::StreamInfoStreamReply;
use crate::commands::stream::StreamMaxlen;
use crate::commands::stream::StreamPendingCountReply;
use crate::commands::stream::StreamPendingReply;
use crate::commands::stream::StreamRangeReply;
use crate::commands::stream::StreamReadOptions;
use crate::commands::stream::StreamReadReply;
use crate::commands::stream::StreamTrimOptions;
use crate::pipeline::Pipeline;
use crate::types::IntegerReplyOrNoOp;
use crate::value::FromValkeyValue;
use crate::value::ValkeyValue;
use crate::write::ToSingleValkeyArg;
use crate::write::ToValkeyArgs;
use crate::write::ValkeyNumericBehavior;
use std::collections::HashSet;
#[cfg(feature = "sync")]
use crate::ValkeyResult;
macro_rules! implement_iterators {
($iter:expr, $ret:ty) => {
#[inline]
fn scan<'s, RV: FromValkeyValue + 's>(&'s self) -> $ret {
($iter)(self, vec![b"SCAN".to_vec()], Vec::new())
}
#[inline]
fn scan_match<'s, P: ToSingleValkeyArg, RV: FromValkeyValue + 's>(
&'s self,
pattern: P,
) -> $ret {
let mut suffix = vec![b"MATCH".to_vec()];
pattern.write_valkey_args(&mut suffix);
($iter)(self, vec![b"SCAN".to_vec()], suffix)
}
#[inline]
fn hscan<'s, K: ToSingleValkeyArg, RV: FromValkeyValue + 's>(&'s self, key: K) -> $ret {
let mut prefix = vec![b"HSCAN".to_vec()];
key.write_valkey_args(&mut prefix);
($iter)(self, prefix, Vec::new())
}
#[inline]
fn hscan_match<'s, K: ToSingleValkeyArg, P: ToSingleValkeyArg, RV: FromValkeyValue + 's>(
&'s self,
key: K,
pattern: P,
) -> $ret {
let mut prefix = vec![b"HSCAN".to_vec()];
key.write_valkey_args(&mut prefix);
let mut suffix = vec![b"MATCH".to_vec()];
pattern.write_valkey_args(&mut suffix);
($iter)(self, prefix, suffix)
}
#[inline]
fn sscan<'s, K: ToSingleValkeyArg, RV: FromValkeyValue + 's>(&'s self, key: K) -> $ret {
let mut prefix = vec![b"SSCAN".to_vec()];
key.write_valkey_args(&mut prefix);
($iter)(self, prefix, Vec::new())
}
#[inline]
fn sscan_match<'s, K: ToSingleValkeyArg, P: ToSingleValkeyArg, RV: FromValkeyValue + 's>(
&'s self,
key: K,
pattern: P,
) -> $ret {
let mut prefix = vec![b"SSCAN".to_vec()];
key.write_valkey_args(&mut prefix);
let mut suffix = vec![b"MATCH".to_vec()];
pattern.write_valkey_args(&mut suffix);
($iter)(self, prefix, suffix)
}
#[inline]
fn zscan<'s, K: ToSingleValkeyArg, RV: FromValkeyValue + 's>(&'s self, key: K) -> $ret {
let mut prefix = vec![b"ZSCAN".to_vec()];
key.write_valkey_args(&mut prefix);
($iter)(self, prefix, Vec::new())
}
#[inline]
fn zscan_match<'s, K: ToSingleValkeyArg, P: ToSingleValkeyArg, RV: FromValkeyValue + 's>(
&'s self,
key: K,
pattern: P,
) -> $ret {
let mut prefix = vec![b"ZSCAN".to_vec()];
key.write_valkey_args(&mut prefix);
let mut suffix = vec![b"MATCH".to_vec()];
pattern.write_valkey_args(&mut suffix);
($iter)(self, prefix, suffix)
}
};
}
macro_rules! implement_typed_command_async {
(
$lifetime:lifetime
$(#[$attr:meta])*
fn $name:ident <$($g:ident: $b:ident),*> ($($arg:ident: $ty:ty),*) Generic
) => {
$(#[$attr])*
#[inline]
#[allow(deprecated)]
#[allow(clippy::extra_unused_lifetimes, clippy::needless_lifetimes)]
fn $name<$lifetime, RV: FromValkeyValue, $($g: $b + Send + Sync + $lifetime,)*>(
&$lifetime self $(, $arg: $ty)*
) -> ValkeyFuture<$lifetime, RV> {
let cmd = Cmd::$name($($arg),*);
Box::pin(async move { RV::from_owned_valkey_value(self.glide_dispatch_command(cmd).await?) })
}
};
(
$lifetime:lifetime
$(#[$attr:meta])*
fn $name:ident <$($g:ident: $b:ident),*> ($($arg:ident: $ty:ty),*) $ret:ty
) => {
$(#[$attr])*
#[inline]
#[allow(deprecated)]
#[allow(unused_parens)]
#[allow(clippy::extra_unused_lifetimes, clippy::needless_lifetimes)]
fn $name<$lifetime, $($g: $b + Send + Sync + $lifetime,)*>(
&$lifetime self $(, $arg: $ty)*
) -> ValkeyFuture<$lifetime, $ret> {
let cmd = Cmd::$name($($arg),*);
Box::pin(async move {
<$ret as FromValkeyValue>::from_owned_valkey_value(self.glide_dispatch_command(cmd).await?)
})
}
};
}
#[cfg(feature = "sync")]
macro_rules! implement_typed_command_sync {
(
$lifetime:lifetime
$(#[$attr:meta])*
fn $name:ident <$($g:ident: $b:ident),*> ($($arg:ident: $ty:ty),*) Generic
) => {
$(#[$attr])*
#[inline]
#[allow(deprecated)]
#[allow(clippy::extra_unused_lifetimes, clippy::needless_lifetimes)]
fn $name<$lifetime, RV: FromValkeyValue, $($g: $b,)*>(
&self $(, $arg: $ty)*
) -> ValkeyResult<RV> {
RV::from_owned_valkey_value(self.glide_dispatch_command(Cmd::$name($($arg),*))?)
}
};
(
$lifetime:lifetime
$(#[$attr:meta])*
fn $name:ident <$($g:ident: $b:ident),*> ($($arg:ident: $ty:ty),*) $ret:ty
) => {
$(#[$attr])*
#[inline]
#[allow(deprecated)]
#[allow(unused_parens)]
#[allow(clippy::extra_unused_lifetimes, clippy::needless_lifetimes)]
fn $name<$lifetime, $($g: $b,)*>(
&self $(, $arg: $ty)*
) -> ValkeyResult<$ret> {
<$ret as FromValkeyValue>::from_owned_valkey_value(
self.glide_dispatch_command(Cmd::$name($($arg),*))?,
)
}
};
}
#[doc(hidden)]
#[sealed::sealed(pub(crate))]
pub trait CommandDispatch: Send + Sync + Sized {
fn glide_dispatch_command<'a>(&'a self, cmd: Cmd) -> ValkeyFuture<'a, ValkeyValue>;
}
#[cfg(feature = "sync")]
#[doc(hidden)]
#[sealed::sealed(pub(crate))]
pub trait SyncCommandDispatch: Sized {
fn glide_dispatch_command(&self, cmd: Cmd) -> ValkeyResult<ValkeyValue>;
}
macro_rules! implement_commands {
(
$lifetime:lifetime;
$(
$(#[$attr:meta])*
fn $name:ident <$($g:ident: $b:ident),*> ($($arg:ident: $ty:ty),*) -> $ret:tt $body:block
)*
) => {
impl Cmd {
$(
$(#[$attr])*
#[allow(clippy::extra_unused_lifetimes, clippy::needless_lifetimes)]
pub(crate) fn $name<$lifetime, $($g: $b),*>($($arg: $ty),*) -> Self $body
)*
}
impl Pipeline {
$(
$(#[$attr])*
#[inline]
#[allow(clippy::extra_unused_lifetimes, clippy::needless_lifetimes)]
pub fn $name<$lifetime, $($g: $b),*>(&mut self $(, $arg: $ty)*) -> &mut Self {
self.add_command(Cmd::$name($($arg),*));
self
}
)*
}
pub trait AsyncCommands: CommandDispatch {
#[inline]
fn glide_send_command<'a>(&'a self, cmd: Cmd) -> ValkeyFuture<'a, ValkeyValue> {
self.glide_dispatch_command(cmd)
}
#[inline]
fn glide_send_command_as<'a, RV: FromValkeyValue>(&'a self, cmd: Cmd) -> ValkeyFuture<'a, RV> {
Box::pin(async move { RV::from_owned_valkey_value(self.glide_send_command(cmd).await?) })
}
$(
$(#[$attr])*
#[inline]
#[allow(deprecated)]
#[allow(clippy::extra_unused_lifetimes, clippy::needless_lifetimes)]
fn $name<$lifetime, $($g: $b + Send + Sync + $lifetime,)* RV>(
&$lifetime self $(, $arg: $ty)*
) -> ValkeyFuture<$lifetime, RV>
where
RV: FromValkeyValue,
{
let cmd = Cmd::$name($($arg),*);
Box::pin(async move { RV::from_owned_valkey_value(self.glide_dispatch_command(cmd).await?) })
}
)*
implement_iterators!(
|con, prefix, suffix| Box::pin(crate::commands::scan::ScanIter::new(con, prefix, suffix)),
ValkeyFuture<'s, crate::commands::scan::ScanIter<'s, Self, RV>>
);
}
impl<T: CommandDispatch> AsyncCommands for T {}
#[cfg(feature = "sync")]
pub trait Commands: SyncCommandDispatch {
#[inline]
fn glide_send_command(&self, cmd: Cmd) -> ValkeyResult<ValkeyValue> {
self.glide_dispatch_command(cmd)
}
#[inline]
fn glide_send_command_as<RV: FromValkeyValue>(&self, cmd: Cmd) -> ValkeyResult<RV> {
RV::from_owned_valkey_value(self.glide_send_command(cmd)?)
}
$(
$(#[$attr])*
#[inline]
#[allow(deprecated)]
#[allow(clippy::extra_unused_lifetimes, clippy::needless_lifetimes)]
fn $name<$lifetime, $($g: $b,)* RV: FromValkeyValue>(
&self $(, $arg: $ty)*
) -> ValkeyResult<RV> {
RV::from_owned_valkey_value(self.glide_dispatch_command(Cmd::$name($($arg),*))?)
}
)*
implement_iterators!(
crate::commands::scan::SyncScanIter::new,
ValkeyResult<crate::commands::scan::SyncScanIter<'s, Self, RV>>
);
}
#[cfg(feature = "sync")]
impl<T: SyncCommandDispatch> Commands for T {}
pub trait AsyncTypedCommands: CommandDispatch {
$(
implement_typed_command_async! {
$lifetime
$(#[$attr])*
fn $name<$($g: $b),*>($($arg: $ty),*) $ret
}
)*
implement_iterators!(
|con, prefix, suffix| Box::pin(crate::commands::scan::ScanIter::new(con, prefix, suffix)),
ValkeyFuture<'s, crate::commands::scan::ScanIter<'s, Self, RV>>
);
}
impl<T: CommandDispatch> AsyncTypedCommands for T {}
#[cfg(feature = "sync")]
pub trait TypedCommands: SyncCommandDispatch {
$(
implement_typed_command_sync! {
$lifetime
$(#[$attr])*
fn $name<$($g: $b),*>($($arg: $ty),*) $ret
}
)*
implement_iterators!(
crate::commands::scan::SyncScanIter::new,
ValkeyResult<crate::commands::scan::SyncScanIter<'s, Self, RV>>
);
}
#[cfg(feature = "sync")]
impl<T: SyncCommandDispatch> TypedCommands for T {}
};
}
fn unzip_weights<K, W>(items: &[(K, W)]) -> (Vec<&K>, Vec<&W>) {
items.iter().map(|(key, weight)| (key, weight)).unzip()
}
macro_rules! build_cmd {
($name:expr $(,)?) => {
$crate::cmd::cmd($name)
};
($name:expr $(, $arg:expr)* $(,)?) => {{
let mut command = $crate::cmd::cmd($name);
$( command.arg($arg); )*
command
}};
}
implement_commands! {
'a;
fn get<K: ToSingleValkeyArg>(key: K) -> (Option<String>) {
build_cmd!("GET", key)
}
fn mget<K: ToValkeyArgs>(key: K) -> (Vec<Option<String>>) {
build_cmd!("MGET", key)
}
fn set<K: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, value: V) -> (()) {
build_cmd!("SET", key, value)
}
fn set_options<K: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, value: V, options: SetOptions) -> (Option<String>) {
build_cmd!("SET", key, value, options)
}
fn mset<K: ToValkeyArgs, V: ToValkeyArgs>(items: &'a [(K, V)]) -> (()) {
build_cmd!("MSET", items)
}
fn set_ex<K: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, value: V, seconds: u64) -> (()) {
build_cmd!("SETEX", key, seconds, value)
}
fn pset_ex<K: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, value: V, milliseconds: u64) -> (()) {
build_cmd!("PSETEX", key, milliseconds, value)
}
fn set_nx<K: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, value: V) -> (bool) {
build_cmd!("SETNX", key, value)
}
fn mset_nx<K: ToValkeyArgs, V: ToValkeyArgs>(items: &'a [(K, V)]) -> (bool) {
build_cmd!("MSETNX", items)
}
fn getset<K: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, value: V) -> (Option<String>) {
build_cmd!("GETSET", key, value)
}
fn getrange<K: ToSingleValkeyArg>(key: K, from: isize, to: isize) -> (String) {
build_cmd!("GETRANGE", key, from, to)
}
fn setrange<K: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, offset: isize, value: V) -> (usize) {
build_cmd!("SETRANGE", key, offset, value)
}
fn get_ex<K: ToSingleValkeyArg>(key: K, expire_at: Expiry) -> (Option<String>) {
build_cmd!("GETEX", key, expire_at)
}
fn get_del<K: ToSingleValkeyArg>(key: K) -> (Option<String>) {
build_cmd!("GETDEL", key)
}
fn append<K: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, value: V) -> (usize) {
build_cmd!("APPEND", key, value)
}
fn incr<K: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, delta: V) -> (isize) {
build_cmd!(if delta.describe_numeric_behavior() == ValkeyNumericBehavior::NumberIsFloat {
"INCRBYFLOAT"
} else {
"INCRBY"
}, key, delta)
}
fn decr<K: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, delta: V) -> (isize) {
build_cmd!("DECRBY", key, delta)
}
fn strlen<K: ToSingleValkeyArg>(key: K) -> (usize) {
build_cmd!("STRLEN", key)
}
fn keys<K: ToSingleValkeyArg>(key: K) -> (Vec<String>) {
build_cmd!("KEYS", key)
}
fn del<K: ToValkeyArgs>(key: K) -> (usize) {
build_cmd!("DEL", key)
}
fn exists<K: ToValkeyArgs>(key: K) -> (bool) {
build_cmd!("EXISTS", key)
}
fn key_type<K: ToSingleValkeyArg>(key: K) -> (crate::types::ValueType) {
build_cmd!("TYPE", key)
}
fn expire<K: ToSingleValkeyArg>(key: K, seconds: i64) -> (bool) {
build_cmd!("EXPIRE", key, seconds)
}
fn expire_at<K: ToSingleValkeyArg>(key: K, ts: i64) -> (bool) {
build_cmd!("EXPIREAT", key, ts)
}
fn expire_time<K: ToSingleValkeyArg>(key: K) -> (IntegerReplyOrNoOp) {
build_cmd!("EXPIRETIME", key)
}
fn pexpire<K: ToSingleValkeyArg>(key: K, ms: i64) -> (bool) {
build_cmd!("PEXPIRE", key, ms)
}
fn pexpire_at<K: ToSingleValkeyArg>(key: K, ts: i64) -> (bool) {
build_cmd!("PEXPIREAT", key, ts)
}
fn pexpire_time<K: ToSingleValkeyArg>(key: K) -> (IntegerReplyOrNoOp) {
build_cmd!("PEXPIRETIME", key)
}
fn persist<K: ToSingleValkeyArg>(key: K) -> (bool) {
build_cmd!("PERSIST", key)
}
fn ttl<K: ToSingleValkeyArg>(key: K) -> (IntegerReplyOrNoOp) {
build_cmd!("TTL", key)
}
fn pttl<K: ToSingleValkeyArg>(key: K) -> (IntegerReplyOrNoOp) {
build_cmd!("PTTL", key)
}
fn rename<K: ToSingleValkeyArg, N: ToSingleValkeyArg>(key: K, new_key: N) -> (()) {
build_cmd!("RENAME", key, new_key)
}
fn rename_nx<K: ToSingleValkeyArg, N: ToSingleValkeyArg>(key: K, new_key: N) -> (bool) {
build_cmd!("RENAMENX", key, new_key)
}
fn unlink<K: ToValkeyArgs>(key: K) -> (usize) {
build_cmd!("UNLINK", key)
}
fn object_encoding<K: ToSingleValkeyArg>(key: K) -> (Option<String>) {
build_cmd!("OBJECT", "ENCODING", key)
}
fn object_idletime<K: ToSingleValkeyArg>(key: K) -> (Option<usize>) {
build_cmd!("OBJECT", "IDLETIME", key)
}
fn object_freq<K: ToSingleValkeyArg>(key: K) -> (Option<usize>) {
build_cmd!("OBJECT", "FREQ", key)
}
fn object_refcount<K: ToSingleValkeyArg>(key: K) -> (Option<usize>) {
build_cmd!("OBJECT", "REFCOUNT", key)
}
fn copy<KSrc: ToSingleValkeyArg, KDst: ToSingleValkeyArg, Db: ToString>(source: KSrc, destination: KDst, options: CopyOptions<Db>) -> (bool) {
build_cmd!("COPY", source, destination, options)
}
fn blmove<S: ToSingleValkeyArg, D: ToSingleValkeyArg>(srckey: S, dstkey: D, src_dir: Direction, dst_dir: Direction, timeout: f64) -> (Option<String>) {
build_cmd!("BLMOVE", srckey, dstkey, src_dir, dst_dir, timeout)
}
fn blmpop<K: ToValkeyArgs>(timeout: f64, numkeys: usize, key: K, dir: Direction, count: usize) -> (Option<(String, Vec<String>)>) {
build_cmd!("BLMPOP", timeout, numkeys, key, dir, "COUNT", count)
}
fn blpop<K: ToValkeyArgs>(key: K, timeout: f64) -> (Option<[String; 2]>) {
build_cmd!("BLPOP", key, timeout)
}
fn brpop<K: ToValkeyArgs>(key: K, timeout: f64) -> (Option<[String; 2]>) {
build_cmd!("BRPOP", key, timeout)
}
fn brpoplpush<S: ToSingleValkeyArg, D: ToSingleValkeyArg>(srckey: S, dstkey: D, timeout: f64) -> (Option<String>) {
build_cmd!("BRPOPLPUSH", srckey, dstkey, timeout)
}
fn lindex<K: ToSingleValkeyArg>(key: K, index: isize) -> (Option<String>) {
build_cmd!("LINDEX", key, index)
}
fn linsert_before<K: ToSingleValkeyArg, P: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, pivot: P, value: V) -> (isize) {
build_cmd!("LINSERT", key, "BEFORE", pivot, value)
}
fn linsert_after<K: ToSingleValkeyArg, P: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, pivot: P, value: V) -> (isize) {
build_cmd!("LINSERT", key, "AFTER", pivot, value)
}
fn llen<K: ToSingleValkeyArg>(key: K) -> (usize) {
build_cmd!("LLEN", key)
}
fn lmove<S: ToSingleValkeyArg, D: ToSingleValkeyArg>(srckey: S, dstkey: D, src_dir: Direction, dst_dir: Direction) -> (String) {
build_cmd!("LMOVE", srckey, dstkey, src_dir, dst_dir)
}
fn lmpop<K: ToValkeyArgs>(numkeys: usize, key: K, dir: Direction, count: usize) -> (Option<(String, Vec<String>)>) {
build_cmd!("LMPOP", numkeys, key, dir, "COUNT", count)
}
fn lpop<K: ToSingleValkeyArg>(key: K, count: Option<core::num::NonZeroUsize>) -> Generic {
build_cmd!("LPOP", key, count)
}
fn lpos<K: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, value: V, options: LposOptions) -> Generic {
build_cmd!("LPOS", key, value, options)
}
fn lpush<K: ToSingleValkeyArg, V: ToValkeyArgs>(key: K, value: V) -> (usize) {
build_cmd!("LPUSH", key, value)
}
fn lpush_exists<K: ToSingleValkeyArg, V: ToValkeyArgs>(key: K, value: V) -> (usize) {
build_cmd!("LPUSHX", key, value)
}
fn lrange<K: ToSingleValkeyArg>(key: K, start: isize, stop: isize) -> (Vec<String>) {
build_cmd!("LRANGE", key, start, stop)
}
fn lrem<K: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, count: isize, value: V) -> (usize) {
build_cmd!("LREM", key, count, value)
}
fn ltrim<K: ToSingleValkeyArg>(key: K, start: isize, stop: isize) -> (()) {
build_cmd!("LTRIM", key, start, stop)
}
fn lset<K: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, index: isize, value: V) -> (()) {
build_cmd!("LSET", key, index, value)
}
fn rpop<K: ToSingleValkeyArg>(key: K, count: Option<core::num::NonZeroUsize>) -> Generic {
build_cmd!("RPOP", key, count)
}
fn rpoplpush<K: ToSingleValkeyArg, D: ToSingleValkeyArg>(key: K, dstkey: D) -> (Option<String>) {
build_cmd!("RPOPLPUSH", key, dstkey)
}
fn rpush<K: ToSingleValkeyArg, V: ToValkeyArgs>(key: K, value: V) -> (usize) {
build_cmd!("RPUSH", key, value)
}
fn rpush_exists<K: ToSingleValkeyArg, V: ToValkeyArgs>(key: K, value: V) -> (usize) {
build_cmd!("RPUSHX", key, value)
}
fn hget<K: ToSingleValkeyArg, F: ToSingleValkeyArg>(key: K, field: F) -> (Option<String>) {
build_cmd!("HGET", key, field)
}
fn hmget<K: ToSingleValkeyArg, F: ToValkeyArgs>(key: K, fields: F) -> (Vec<String>) {
build_cmd!("HMGET", key, fields)
}
fn hdel<K: ToSingleValkeyArg, F: ToValkeyArgs>(key: K, field: F) -> (usize) {
build_cmd!("HDEL", key, field)
}
fn hset<K: ToSingleValkeyArg, F: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, field: F, value: V) -> (usize) {
build_cmd!("HSET", key, field, value)
}
fn hset_multiple<K: ToSingleValkeyArg, F: ToValkeyArgs, V: ToValkeyArgs>(key: K, items: &'a [(F, V)]) -> (usize) {
build_cmd!("HSET", key, items)
}
fn hset_nx<K: ToSingleValkeyArg, F: ToSingleValkeyArg, V: ToSingleValkeyArg>(key: K, field: F, value: V) -> (bool) {
build_cmd!("HSETNX", key, field, value)
}
fn hincr<K: ToSingleValkeyArg, F: ToSingleValkeyArg, D: ToSingleValkeyArg>(key: K, field: F, delta: D) -> (f64) {
build_cmd!(if delta.describe_numeric_behavior() == ValkeyNumericBehavior::NumberIsFloat {
"HINCRBYFLOAT"
} else {
"HINCRBY"
}, key, field, delta)
}
fn hexists<K: ToSingleValkeyArg, F: ToSingleValkeyArg>(key: K, field: F) -> (bool) {
build_cmd!("HEXISTS", key, field)
}
fn hkeys<K: ToSingleValkeyArg>(key: K) -> (Vec<String>) {
build_cmd!("HKEYS", key)
}
fn hvals<K: ToSingleValkeyArg>(key: K) -> (Vec<String>) {
build_cmd!("HVALS", key)
}
fn hgetall<K: ToSingleValkeyArg>(key: K) -> (std::collections::HashMap<String, String>) {
build_cmd!("HGETALL", key)
}
fn hlen<K: ToSingleValkeyArg>(key: K) -> (usize) {
build_cmd!("HLEN", key)
}
fn hget_ex<K: ToSingleValkeyArg, F: ToValkeyArgs>(key: K, fields: F, expire_at: Expiry) -> (Vec<String>) {
build_cmd!("HGETEX", key, expire_at, "FIELDS", fields.num_of_args(), fields)
}
fn hset_ex<K: ToSingleValkeyArg, F: ToValkeyArgs, V: ToValkeyArgs>(key: K, hash_field_expiration_options: &'a HashFieldExpirationOptions, fields_values: &'a [(F, V)]) -> (bool) {
build_cmd!("HSETEX", key, hash_field_expiration_options, "FIELDS", fields_values.len(), fields_values)
}
fn httl<K: ToSingleValkeyArg, F: ToValkeyArgs>(key: K, fields: F) -> (Vec<IntegerReplyOrNoOp>) {
build_cmd!("HTTL", key, "FIELDS", fields.num_of_args(), fields)
}
fn hpttl<K: ToSingleValkeyArg, F: ToValkeyArgs>(key: K, fields: F) -> (Vec<IntegerReplyOrNoOp>) {
build_cmd!("HPTTL", key, "FIELDS", fields.num_of_args(), fields)
}
fn hexpire<K: ToSingleValkeyArg, F: ToValkeyArgs>(key: K, seconds: i64, opt: ExpireOption, fields: F) -> (Vec<IntegerReplyOrNoOp>) {
build_cmd!("HEXPIRE", key, seconds, opt, "FIELDS", fields.num_of_args(), fields)
}
fn hexpire_at<K: ToSingleValkeyArg, F: ToValkeyArgs>(key: K, ts: i64, opt: ExpireOption, fields: F) -> (Vec<IntegerReplyOrNoOp>) {
build_cmd!("HEXPIREAT", key, ts, opt, "FIELDS", fields.num_of_args(), fields)
}
fn hexpire_time<K: ToSingleValkeyArg, F: ToValkeyArgs>(key: K, fields: F) -> (Vec<IntegerReplyOrNoOp>) {
build_cmd!("HEXPIRETIME", key, "FIELDS", fields.num_of_args(), fields)
}
fn hpersist<K: ToSingleValkeyArg, F: ToValkeyArgs>(key: K, fields: F) -> (Vec<IntegerReplyOrNoOp>) {
build_cmd!("HPERSIST", key, "FIELDS", fields.num_of_args(), fields)
}
fn hpexpire<K: ToSingleValkeyArg, F: ToValkeyArgs>(key: K, milliseconds: i64, opt: ExpireOption, fields: F) -> (Vec<IntegerReplyOrNoOp>) {
build_cmd!("HPEXPIRE", key, milliseconds, opt, "FIELDS", fields.num_of_args(), fields)
}
fn hpexpire_at<K: ToSingleValkeyArg, F: ToValkeyArgs>(key: K, ts: i64, opt: ExpireOption, fields: F) -> (Vec<IntegerReplyOrNoOp>) {
build_cmd!("HPEXPIREAT", key, ts, opt, "FIELDS", fields.num_of_args(), fields)
}
fn hpexpire_time<K: ToSingleValkeyArg, F: ToValkeyArgs>(key: K, fields: F) -> (Vec<IntegerReplyOrNoOp>) {
build_cmd!("HPEXPIRETIME", key, "FIELDS", fields.num_of_args(), fields)
}
fn sadd<K: ToSingleValkeyArg, M: ToValkeyArgs>(key: K, member: M) -> (usize) {
build_cmd!("SADD", key, member)
}
fn scard<K: ToSingleValkeyArg>(key: K) -> (usize) {
build_cmd!("SCARD", key)
}
fn sdiff<K: ToValkeyArgs>(keys: K) -> (HashSet<String>) {
build_cmd!("SDIFF", keys)
}
fn sdiffstore<D: ToSingleValkeyArg, K: ToValkeyArgs>(dstkey: D, keys: K) -> (usize) {
build_cmd!("SDIFFSTORE", dstkey, keys)
}
fn sinter<K: ToValkeyArgs>(keys: K) -> (HashSet<String>) {
build_cmd!("SINTER", keys)
}
fn sinterstore<D: ToSingleValkeyArg, K: ToValkeyArgs>(dstkey: D, keys: K) -> (usize) {
build_cmd!("SINTERSTORE", dstkey, keys)
}
fn sismember<K: ToSingleValkeyArg, M: ToSingleValkeyArg>(key: K, member: M) -> (bool) {
build_cmd!("SISMEMBER", key, member)
}
fn smismember<K: ToSingleValkeyArg, M: ToValkeyArgs>(key: K, members: M) -> (Vec<bool>) {
build_cmd!("SMISMEMBER", key, members)
}
fn smembers<K: ToSingleValkeyArg>(key: K) -> (HashSet<String>) {
build_cmd!("SMEMBERS", key)
}
fn smove<S: ToSingleValkeyArg, D: ToSingleValkeyArg, M: ToSingleValkeyArg>(srckey: S, dstkey: D, member: M) -> (bool) {
build_cmd!("SMOVE", srckey, dstkey, member)
}
fn spop<K: ToSingleValkeyArg>(key: K) -> Generic {
build_cmd!("SPOP", key)
}
fn srandmember<K: ToSingleValkeyArg>(key: K) -> (Option<String>) {
build_cmd!("SRANDMEMBER", key)
}
fn srandmember_multiple<K: ToSingleValkeyArg>(key: K, count: isize) -> (Vec<String>) {
build_cmd!("SRANDMEMBER", key, count)
}
fn srem<K: ToSingleValkeyArg, M: ToValkeyArgs>(key: K, member: M) -> (usize) {
build_cmd!("SREM", key, member)
}
fn sunion<K: ToValkeyArgs>(keys: K) -> (HashSet<String>) {
build_cmd!("SUNION", keys)
}
fn sunionstore<D: ToSingleValkeyArg, K: ToValkeyArgs>(dstkey: D, keys: K) -> (usize) {
build_cmd!("SUNIONSTORE", dstkey, keys)
}
fn zadd<K: ToSingleValkeyArg, S: ToSingleValkeyArg, M: ToSingleValkeyArg>(key: K, member: M, score: S) -> usize {
build_cmd!("ZADD", key, score, member)
}
fn zadd_multiple<K: ToSingleValkeyArg, S: ToValkeyArgs, M: ToValkeyArgs>(key: K, items: &'a [(S, M)]) -> (usize) {
build_cmd!("ZADD", key, items)
}
fn zcard<K: ToSingleValkeyArg>(key: K) -> (usize) {
build_cmd!("ZCARD", key)
}
fn zcount<K: ToSingleValkeyArg, M: ToSingleValkeyArg, MM: ToSingleValkeyArg>(key: K, min: M, max: MM) -> (usize) {
build_cmd!("ZCOUNT", key, min, max)
}
fn zincr<K: ToSingleValkeyArg, M: ToSingleValkeyArg, D: ToSingleValkeyArg>(key: K, member: M, delta: D) -> (f64) {
build_cmd!("ZINCRBY", key, delta, member)
}
fn zinterstore<D: ToSingleValkeyArg, K: ToValkeyArgs>(dstkey: D, keys: K) -> (usize) {
build_cmd!("ZINTERSTORE", dstkey, keys.num_of_args(), keys)
}
fn zinterstore_min<D: ToSingleValkeyArg, K: ToValkeyArgs>(dstkey: D, keys: K) -> (usize) {
build_cmd!("ZINTERSTORE", dstkey, keys.num_of_args(), keys, "AGGREGATE", "MIN")
}
fn zinterstore_max<D: ToSingleValkeyArg, K: ToValkeyArgs>(dstkey: D, keys: K) -> (usize) {
build_cmd!("ZINTERSTORE", dstkey, keys.num_of_args(), keys, "AGGREGATE", "MAX")
}
fn zinterstore_weights<D: ToSingleValkeyArg, K: ToValkeyArgs, W: ToValkeyArgs>(dstkey: D, keys: &'a [(K, W)]) -> (usize) {
let (keys, weights) = unzip_weights(keys);
build_cmd!("ZINTERSTORE", dstkey, keys.len(), keys, "WEIGHTS", weights)
}
fn zinterstore_min_weights<D: ToSingleValkeyArg, K: ToValkeyArgs, W: ToValkeyArgs>(dstkey: D, keys: &'a [(K, W)]) -> (usize) {
let (keys, weights) = unzip_weights(keys);
build_cmd!("ZINTERSTORE", dstkey, keys.len(), keys, "AGGREGATE", "MIN", "WEIGHTS", weights)
}
fn zinterstore_max_weights<D: ToSingleValkeyArg, K: ToValkeyArgs, W: ToValkeyArgs>(dstkey: D, keys: &'a [(K, W)]) -> (usize) {
let (keys, weights) = unzip_weights(keys);
build_cmd!("ZINTERSTORE", dstkey, keys.len(), keys, "AGGREGATE", "MAX", "WEIGHTS", weights)
}
fn zlexcount<K: ToSingleValkeyArg, M: ToSingleValkeyArg, MM: ToSingleValkeyArg>(key: K, min: M, max: MM) -> (usize) {
build_cmd!("ZLEXCOUNT", key, min, max)
}
fn bzpopmax<K: ToValkeyArgs>(key: K, timeout: f64) -> (Option<(String, String, f64)>) {
build_cmd!("BZPOPMAX", key, timeout)
}
fn zpopmax<K: ToSingleValkeyArg>(key: K, count: isize) -> (Vec<(String, f64)>) {
build_cmd!("ZPOPMAX", key, count)
}
fn bzpopmin<K: ToValkeyArgs>(key: K, timeout: f64) -> (Option<(String, String, f64)>) {
build_cmd!("BZPOPMIN", key, timeout)
}
fn zpopmin<K: ToSingleValkeyArg>(key: K, count: isize) -> (Vec<(String, f64)>) {
build_cmd!("ZPOPMIN", key, count)
}
fn bzmpop_max<K: ToValkeyArgs>(timeout: f64, keys: K, count: isize) -> (Option<(String, Vec<(String, f64)>)>) {
build_cmd!("BZMPOP", timeout, keys.num_of_args(), keys, "MAX", "COUNT", count)
}
fn zmpop_max<K: ToValkeyArgs>(keys: K, count: isize) -> (Option<(String, Vec<(String, f64)>)>) {
build_cmd!("ZMPOP", keys.num_of_args(), keys, "MAX", "COUNT", count)
}
fn bzmpop_min<K: ToValkeyArgs>(timeout: f64, keys: K, count: isize) -> (Option<(String, Vec<(String, f64)>)>) {
build_cmd!("BZMPOP", timeout, keys.num_of_args(), keys, "MIN", "COUNT", count)
}
fn zmpop_min<K: ToValkeyArgs>(keys: K, count: isize) -> (Option<(String, Vec<(String, f64)>)>) {
build_cmd!("ZMPOP", keys.num_of_args(), keys, "MIN", "COUNT", count)
}
fn zrandmember<K: ToSingleValkeyArg>(key: K, count: Option<isize>) -> Generic {
build_cmd!("ZRANDMEMBER", key, count)
}
fn zrandmember_withscores<K: ToSingleValkeyArg>(key: K, count: isize) -> Generic {
build_cmd!("ZRANDMEMBER", key, count, "WITHSCORES")
}
fn zrange<K: ToSingleValkeyArg>(key: K, start: isize, stop: isize) -> (Vec<String>) {
build_cmd!("ZRANGE", key, start, stop)
}
fn zrange_withscores<K: ToSingleValkeyArg>(key: K, start: isize, stop: isize) -> (Vec<(String, f64)>) {
build_cmd!("ZRANGE", key, start, stop, "WITHSCORES")
}
fn zrangebylex<K: ToSingleValkeyArg, M: ToSingleValkeyArg, MM: ToSingleValkeyArg>(key: K, min: M, max: MM) -> (Vec<String>) {
build_cmd!("ZRANGEBYLEX", key, min, max)
}
fn zrangebylex_limit<K: ToSingleValkeyArg, M: ToSingleValkeyArg, MM: ToSingleValkeyArg>(key: K, min: M, max: MM, offset: isize, count: isize) -> (Vec<String>) {
build_cmd!("ZRANGEBYLEX", key, min, max, "LIMIT", offset, count)
}
fn zrevrangebylex<K: ToSingleValkeyArg, MM: ToSingleValkeyArg, M: ToSingleValkeyArg>(key: K, max: MM, min: M) -> (Vec<String>) {
build_cmd!("ZREVRANGEBYLEX", key, max, min)
}
fn zrevrangebylex_limit<K: ToSingleValkeyArg, MM: ToSingleValkeyArg, M: ToSingleValkeyArg>(key: K, max: MM, min: M, offset: isize, count: isize) -> (Vec<String>) {
build_cmd!("ZREVRANGEBYLEX", key, max, min, "LIMIT", offset, count)
}
fn zrangebyscore<K: ToSingleValkeyArg, M: ToSingleValkeyArg, MM: ToSingleValkeyArg>(key: K, min: M, max: MM) -> (Vec<String>) {
build_cmd!("ZRANGEBYSCORE", key, min, max)
}
fn zrangebyscore_withscores<K: ToSingleValkeyArg, M: ToSingleValkeyArg, MM: ToSingleValkeyArg>(key: K, min: M, max: MM) -> (Vec<(String, usize)>) {
build_cmd!("ZRANGEBYSCORE", key, min, max, "WITHSCORES")
}
fn zrangebyscore_limit<K: ToSingleValkeyArg, M: ToSingleValkeyArg, MM: ToSingleValkeyArg>(key: K, min: M, max: MM, offset: isize, count: isize) -> (Vec<String>) {
build_cmd!("ZRANGEBYSCORE", key, min, max, "LIMIT", offset, count)
}
fn zrangebyscore_limit_withscores<K: ToSingleValkeyArg, M: ToSingleValkeyArg, MM: ToSingleValkeyArg>(key: K, min: M, max: MM, offset: isize, count: isize) -> (Vec<(String, usize)>) {
build_cmd!("ZRANGEBYSCORE", key, min, max, "WITHSCORES", "LIMIT", offset, count)
}
fn zrank<K: ToSingleValkeyArg, M: ToSingleValkeyArg>(key: K, member: M) -> (Option<usize>) {
build_cmd!("ZRANK", key, member)
}
fn zrem<K: ToSingleValkeyArg, M: ToValkeyArgs>(key: K, members: M) -> (usize) {
build_cmd!("ZREM", key, members)
}
fn zrembylex<K: ToSingleValkeyArg, M: ToSingleValkeyArg, MM: ToSingleValkeyArg>(key: K, min: M, max: MM) -> (usize) {
build_cmd!("ZREMRANGEBYLEX", key, min, max)
}
fn zremrangebyrank<K: ToSingleValkeyArg>(key: K, start: isize, stop: isize) -> (usize) {
build_cmd!("ZREMRANGEBYRANK", key, start, stop)
}
fn zrembyscore<K: ToSingleValkeyArg, M: ToSingleValkeyArg, MM: ToSingleValkeyArg>(key: K, min: M, max: MM) -> (usize) {
build_cmd!("ZREMRANGEBYSCORE", key, min, max)
}
fn zrevrange<K: ToSingleValkeyArg>(key: K, start: isize, stop: isize) -> (Vec<String>) {
build_cmd!("ZREVRANGE", key, start, stop)
}
fn zrevrange_withscores<K: ToSingleValkeyArg>(key: K, start: isize, stop: isize) -> (Vec<(String, f64)>) {
build_cmd!("ZREVRANGE", key, start, stop, "WITHSCORES")
}
fn zrevrangebyscore<K: ToSingleValkeyArg, MM: ToSingleValkeyArg, M: ToSingleValkeyArg>(key: K, max: MM, min: M) -> (Vec<String>) {
build_cmd!("ZREVRANGEBYSCORE", key, max, min)
}
fn zrevrangebyscore_withscores<K: ToSingleValkeyArg, MM: ToSingleValkeyArg, M: ToSingleValkeyArg>(key: K, max: MM, min: M) -> (Vec<(String, f64)>) {
build_cmd!("ZREVRANGEBYSCORE", key, max, min, "WITHSCORES")
}
fn zrevrangebyscore_limit<K: ToSingleValkeyArg, MM: ToSingleValkeyArg, M: ToSingleValkeyArg>(key: K, max: MM, min: M, offset: isize, count: isize) -> (Vec<String>) {
build_cmd!("ZREVRANGEBYSCORE", key, max, min, "LIMIT", offset, count)
}
fn zrevrangebyscore_limit_withscores<K: ToSingleValkeyArg, MM: ToSingleValkeyArg, M: ToSingleValkeyArg>(key: K, max: MM, min: M, offset: isize, count: isize) -> (Vec<(String, f64)>) {
build_cmd!("ZREVRANGEBYSCORE", key, max, min, "WITHSCORES", "LIMIT", offset, count)
}
fn zrevrank<K: ToSingleValkeyArg, M: ToSingleValkeyArg>(key: K, member: M) -> (Option<usize>) {
build_cmd!("ZREVRANK", key, member)
}
fn zscore<K: ToSingleValkeyArg, M: ToSingleValkeyArg>(key: K, member: M) -> (Option<f64>) {
build_cmd!("ZSCORE", key, member)
}
fn zscore_multiple<K: ToSingleValkeyArg, M: ToValkeyArgs>(key: K, members: &'a [M]) -> (Option<Vec<f64>>) {
build_cmd!("ZMSCORE", key, members)
}
fn zunionstore<D: ToSingleValkeyArg, K: ToValkeyArgs>(dstkey: D, keys: K) -> (usize) {
build_cmd!("ZUNIONSTORE", dstkey, keys.num_of_args(), keys)
}
fn zunionstore_min<D: ToSingleValkeyArg, K: ToValkeyArgs>(dstkey: D, keys: K) -> (usize) {
build_cmd!("ZUNIONSTORE", dstkey, keys.num_of_args(), keys, "AGGREGATE", "MIN")
}
fn zunionstore_max<D: ToSingleValkeyArg, K: ToValkeyArgs>(dstkey: D, keys: K) -> (usize) {
build_cmd!("ZUNIONSTORE", dstkey, keys.num_of_args(), keys, "AGGREGATE", "MAX")
}
fn zunionstore_weights<D: ToSingleValkeyArg, K: ToValkeyArgs, W: ToValkeyArgs>(dstkey: D, keys: &'a [(K, W)]) -> (usize) {
let (keys, weights) = unzip_weights(keys);
build_cmd!("ZUNIONSTORE", dstkey, keys.len(), keys, "WEIGHTS", weights)
}
fn zunionstore_min_weights<D: ToSingleValkeyArg, K: ToValkeyArgs, W: ToValkeyArgs>(dstkey: D, keys: &'a [(K, W)]) -> (usize) {
let (keys, weights) = unzip_weights(keys);
build_cmd!("ZUNIONSTORE", dstkey, keys.len(), keys, "AGGREGATE", "MIN", "WEIGHTS", weights)
}
fn zunionstore_max_weights<D: ToSingleValkeyArg, K: ToValkeyArgs, W: ToValkeyArgs>(dstkey: D, keys: &'a [(K, W)]) -> (usize) {
let (keys, weights) = unzip_weights(keys);
build_cmd!("ZUNIONSTORE", dstkey, keys.len(), keys, "AGGREGATE", "MAX", "WEIGHTS", weights)
}
fn pfadd<K: ToSingleValkeyArg, E: ToValkeyArgs>(key: K, element: E) -> (bool) {
build_cmd!("PFADD", key, element)
}
fn pfcount<K: ToValkeyArgs>(key: K) -> (usize) {
build_cmd!("PFCOUNT", key)
}
fn pfmerge<D: ToSingleValkeyArg, S: ToValkeyArgs>(dstkey: D, srckeys: S) -> (()) {
build_cmd!("PFMERGE", dstkey, srckeys)
}
fn setbit<K: ToSingleValkeyArg>(key: K, offset: usize, value: bool) -> (bool) {
build_cmd!("SETBIT", key, offset, i32::from(value))
}
fn getbit<K: ToSingleValkeyArg>(key: K, offset: usize) -> (bool) {
build_cmd!("GETBIT", key, offset)
}
fn bitcount<K: ToSingleValkeyArg>(key: K) -> (usize) {
build_cmd!("BITCOUNT", key)
}
fn bitcount_range<K: ToSingleValkeyArg>(key: K, start: usize, end: usize) -> (usize) {
build_cmd!("BITCOUNT", key, start, end)
}
fn bit_and<D: ToSingleValkeyArg, S: ToValkeyArgs>(dstkey: D, srckeys: S) -> (usize) {
build_cmd!("BITOP", "AND", dstkey, srckeys)
}
fn bit_or<D: ToSingleValkeyArg, S: ToValkeyArgs>(dstkey: D, srckeys: S) -> (usize) {
build_cmd!("BITOP", "OR", dstkey, srckeys)
}
fn bit_xor<D: ToSingleValkeyArg, S: ToValkeyArgs>(dstkey: D, srckeys: S) -> (usize) {
build_cmd!("BITOP", "XOR", dstkey, srckeys)
}
fn bit_not<D: ToSingleValkeyArg, S: ToSingleValkeyArg>(dstkey: D, srckey: S) -> (usize) {
build_cmd!("BITOP", "NOT", dstkey, srckey)
}
fn geo_add<K: ToSingleValkeyArg, M: ToValkeyArgs>(key: K, members: M) -> (usize) {
build_cmd!("GEOADD", key, members)
}
fn geo_dist<K: ToSingleValkeyArg, M1: ToSingleValkeyArg, M2: ToSingleValkeyArg>(key: K, member1: M1, member2: M2, unit: GeoUnit) -> (Option<f64>) {
build_cmd!("GEODIST", key, member1, member2, unit)
}
fn geo_hash<K: ToSingleValkeyArg, M: ToValkeyArgs>(key: K, members: M) -> (Vec<String>) {
build_cmd!("GEOHASH", key, members)
}
fn geo_pos<K: ToSingleValkeyArg, M: ToValkeyArgs>(key: K, members: M) -> (Vec<Option<GeoCoord<f64>>>) {
build_cmd!("GEOPOS", key, members)
}
fn xack<K: ToValkeyArgs, G: ToValkeyArgs, I: ToValkeyArgs>(key: K, group: G, ids: &'a [I]) -> (usize) {
build_cmd!("XACK", key, group, ids)
}
fn xadd<K: ToValkeyArgs, ID: ToValkeyArgs, F: ToValkeyArgs, V: ToValkeyArgs>(key: K, id: ID, items: &'a [(F, V)]) -> (Option<String>) {
build_cmd!("XADD", key, id, items)
}
fn xadd_options<K: ToValkeyArgs, ID: ToValkeyArgs, I: ToValkeyArgs>(key: K, id: ID, items: I, options: &'a StreamAddOptions) -> (Option<String>) {
build_cmd!("XADD", key, options, id, items)
}
fn xautoclaim_options<K: ToSingleValkeyArg, G: ToValkeyArgs, C: ToValkeyArgs, MIT: ToValkeyArgs, S: ToValkeyArgs>(key: K, group: G, consumer: C, min_idle_time: MIT, start: S, options: StreamAutoClaimOptions) -> (StreamAutoClaimReply) {
build_cmd!("XAUTOCLAIM", key, group, consumer, min_idle_time, start, options)
}
fn xclaim<K: ToSingleValkeyArg, G: ToValkeyArgs, C: ToValkeyArgs, MIT: ToValkeyArgs, ID: ToValkeyArgs>(key: K, group: G, consumer: C, min_idle_time: MIT, ids: &'a [ID]) -> (StreamClaimReply) {
build_cmd!("XCLAIM", key, group, consumer, min_idle_time, ids)
}
fn xclaim_options<K: ToSingleValkeyArg, G: ToValkeyArgs, C: ToValkeyArgs, MIT: ToValkeyArgs, ID: ToValkeyArgs>(key: K, group: G, consumer: C, min_idle_time: MIT, ids: &'a [ID], options: StreamClaimOptions) -> Generic {
build_cmd!("XCLAIM", key, group, consumer, min_idle_time, ids, options)
}
fn xdel<K: ToSingleValkeyArg, ID: ToValkeyArgs>(key: K, ids: &'a [ID]) -> (usize) {
build_cmd!("XDEL", key, ids)
}
fn xgroup_create<K: ToValkeyArgs, G: ToValkeyArgs, ID: ToValkeyArgs>(key: K, group: G, id: ID) -> () {
build_cmd!("XGROUP", "CREATE", key, group, id)
}
fn xgroup_create_mkstream<K: ToValkeyArgs, G: ToValkeyArgs, ID: ToValkeyArgs>(key: K, group: G, id: ID) -> () {
build_cmd!("XGROUP", "CREATE", key, group, id, "MKSTREAM")
}
fn xgroup_createconsumer<K: ToValkeyArgs, G: ToValkeyArgs, C: ToValkeyArgs>(key: K, group: G, consumer: C) -> bool {
build_cmd!("XGROUP", "CREATECONSUMER", key, group, consumer)
}
fn xgroup_delconsumer<K: ToValkeyArgs, G: ToValkeyArgs, C: ToValkeyArgs>(key: K, group: G, consumer: C) -> usize {
build_cmd!("XGROUP", "DELCONSUMER", key, group, consumer)
}
fn xgroup_destroy<K: ToValkeyArgs, G: ToValkeyArgs>(key: K, group: G) -> bool {
build_cmd!("XGROUP", "DESTROY", key, group)
}
fn xgroup_setid<K: ToValkeyArgs, G: ToValkeyArgs, ID: ToValkeyArgs>(key: K, group: G, id: ID) -> () {
build_cmd!("XGROUP", "SETID", key, group, id)
}
fn xinfo_consumers<K: ToValkeyArgs, G: ToValkeyArgs>(key: K, group: G) -> (StreamInfoConsumersReply) {
build_cmd!("XINFO", "CONSUMERS", key, group)
}
fn xinfo_groups<K: ToValkeyArgs>(key: K) -> (StreamInfoGroupsReply) {
build_cmd!("XINFO", "GROUPS", key)
}
fn xinfo_stream<K: ToValkeyArgs>(key: K) -> (StreamInfoStreamReply) {
build_cmd!("XINFO", "STREAM", key)
}
fn xlen<K: ToValkeyArgs>(key: K) -> usize {
build_cmd!("XLEN", key)
}
fn xpending<K: ToValkeyArgs, G: ToValkeyArgs>(key: K, group: G) -> (StreamPendingReply) {
build_cmd!("XPENDING", key, group)
}
fn xpending_count<K: ToValkeyArgs, G: ToValkeyArgs, S: ToValkeyArgs, E: ToValkeyArgs, C: ToValkeyArgs>(key: K, group: G, start: S, end: E, count: C) -> (StreamPendingCountReply) {
build_cmd!("XPENDING", key, group, start, end, count)
}
fn xpending_consumer_count<K: ToValkeyArgs, G: ToValkeyArgs, S: ToValkeyArgs, E: ToValkeyArgs, C: ToValkeyArgs, CN: ToValkeyArgs>(key: K, group: G, start: S, end: E, count: C, consumer: CN) -> (StreamPendingCountReply) {
build_cmd!("XPENDING", key, group, start, end, count, consumer)
}
fn xrange<K: ToValkeyArgs, S: ToValkeyArgs, E: ToValkeyArgs>(key: K, start: S, end: E) -> (StreamRangeReply) {
build_cmd!("XRANGE", key, start, end)
}
fn xread<K: ToValkeyArgs, ID: ToValkeyArgs>(keys: &'a [K], ids: &'a [ID]) -> (Option<StreamReadReply>) {
build_cmd!("XREAD", "STREAMS", keys, ids)
}
fn xread_options<K: ToValkeyArgs, ID: ToValkeyArgs>(keys: &'a [K], ids: &'a [ID], options: &'a StreamReadOptions) -> (Option<StreamReadReply>) {
build_cmd!("XREAD", options, "STREAMS", keys, ids)
}
fn xrevrange<K: ToValkeyArgs, E: ToValkeyArgs, S: ToValkeyArgs>(key: K, end: E, start: S) -> (StreamRangeReply) {
build_cmd!("XREVRANGE", key, end, start)
}
fn xtrim<K: ToValkeyArgs>(key: K, maxlen: StreamMaxlen) -> usize {
build_cmd!("XTRIM", key, maxlen)
}
fn xtrim_options<K: ToValkeyArgs>(key: K, options: &'a StreamTrimOptions) -> usize {
build_cmd!("XTRIM", key, options)
}
fn ping<>() -> (String) {
build_cmd!("PING")
}
fn ping_message<K: ToSingleValkeyArg>(message: K) -> (String) {
build_cmd!("PING", message)
}
fn client_getname<>() -> (Option<String>) {
build_cmd!("CLIENT", "GETNAME")
}
fn client_id<>() -> (isize) {
build_cmd!("CLIENT", "ID")
}
fn client_setname<K: ToSingleValkeyArg>(connection_name: K) -> (()) {
build_cmd!("CLIENT", "SETNAME", connection_name)
}
fn flushall<>() -> () {
build_cmd!("FLUSHALL")
}
fn flushall_options<>(options: &'a FlushAllOptions) -> () {
build_cmd!("FLUSHALL", options)
}
fn flushdb<>() -> () {
build_cmd!("FLUSHDB")
}
fn flushdb_options<>(options: &'a FlushDbOptions) -> () {
build_cmd!("FLUSHDB", options)
}
fn publish<K: ToSingleValkeyArg, E: ToSingleValkeyArg>(channel: K, message: E) -> (usize) {
build_cmd!("PUBLISH", channel, message)
}
fn spublish<K: ToSingleValkeyArg, E: ToSingleValkeyArg>(channel: K, message: E) -> (usize) {
build_cmd!("SPUBLISH", channel, message)
}
}