use crate::error::Result;
use crate::string::conf::Set;
use crate::zset::RangeScoreSpec;
pub trait KvOps {
fn get(&self, key: impl AsRef<[u8]>) -> Result<Option<Vec<u8>>>;
fn set<'a>(
&self,
key: impl AsRef<[u8]>,
val: impl AsRef<[u8]>,
opts: impl AsRef<[Set<'a>]>,
) -> Result<()>;
fn set_ex(&self, key: impl AsRef<[u8]>, val: impl AsRef<[u8]>, expire_ms: u64) -> Result<()>;
fn incr(&self, key: impl AsRef<[u8]>) -> Result<i64>;
fn incrby(&self, key: impl AsRef<[u8]>, step: i64) -> Result<i64>;
fn decr(&self, key: impl AsRef<[u8]>) -> Result<i64>;
fn decrby(&self, key: impl AsRef<[u8]>, step: i64) -> Result<i64>;
fn strlen(&self, key: impl AsRef<[u8]>) -> Result<usize>;
fn getdel(&self, key: impl AsRef<[u8]>) -> Result<Option<Vec<u8>>>;
fn getset(&self, key: impl AsRef<[u8]>, val: impl AsRef<[u8]>) -> Result<Option<Vec<u8>>>;
fn mget<K: AsRef<[u8]>>(&self, keys: &[K]) -> Result<Vec<Option<Vec<u8>>>>;
fn mset<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, kvs: &[(K, V)]) -> Result<()>;
}
pub trait HashOps {
fn hget(&self, key: impl AsRef<[u8]>, field: impl AsRef<[u8]>) -> Result<Option<Vec<u8>>>;
fn hset<K: AsRef<[u8]>, F: AsRef<[u8]>, V: AsRef<[u8]>>(
&self,
key: K,
fields: &[(F, V)],
) -> Result<usize>;
fn hdel<K: AsRef<[u8]>, F: AsRef<[u8]>>(&self, key: K, fields: &[F]) -> Result<usize>;
fn hexists(&self, key: impl AsRef<[u8]>, field: impl AsRef<[u8]>) -> Result<bool>;
fn hlen(&self, key: impl AsRef<[u8]>) -> Result<usize>;
fn hgetall(&self, key: impl AsRef<[u8]>) -> Result<Vec<(Vec<u8>, Vec<u8>)>>;
fn hkeys(&self, key: impl AsRef<[u8]>) -> Result<Vec<Vec<u8>>>;
fn hvals(&self, key: impl AsRef<[u8]>) -> Result<Vec<Vec<u8>>>;
fn hincrby(&self, key: impl AsRef<[u8]>, field: impl AsRef<[u8]>, step: i64) -> Result<i64>;
fn hincrbyfloat(
&self,
key: impl AsRef<[u8]>,
field: impl AsRef<[u8]>,
step: f64,
) -> Result<f64>;
fn hmget<K: AsRef<[u8]>, F: AsRef<[u8]>>(
&self,
key: K,
fields: &[F],
) -> Result<Vec<Option<Vec<u8>>>>;
fn hmset<K: AsRef<[u8]>, F: AsRef<[u8]>, V: AsRef<[u8]>>(
&self,
key: K,
fields: &[(F, V)],
) -> Result<()>;
fn hstrlen(&self, key: impl AsRef<[u8]>, field: impl AsRef<[u8]>) -> Result<usize>;
}
pub trait ListOps {
fn lpush<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, values: &[V]) -> Result<u64>;
fn rpush<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, values: &[V]) -> Result<u64>;
fn lpop(&self, key: impl AsRef<[u8]>, count: usize) -> Result<Vec<Vec<u8>>>;
fn rpop(&self, key: impl AsRef<[u8]>, count: usize) -> Result<Vec<Vec<u8>>>;
fn llen(&self, key: impl AsRef<[u8]>) -> Result<u64>;
fn lindex(&self, key: impl AsRef<[u8]>, index: i64) -> Result<Option<Vec<u8>>>;
fn lrange(&self, key: impl AsRef<[u8]>, start: i64, stop: i64) -> Result<Vec<Vec<u8>>>;
fn ltrim(&self, key: impl AsRef<[u8]>, start: i64, stop: i64) -> Result<()>;
fn lset(&self, key: impl AsRef<[u8]>, index: i64, value: impl AsRef<[u8]>) -> Result<()>;
}
pub trait SetOps {
fn sadd<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, members: &[M]) -> Result<usize>;
fn srem<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, members: &[M]) -> Result<usize>;
fn smembers(&self, key: impl AsRef<[u8]>) -> Result<Vec<Vec<u8>>>;
fn sismember(&self, key: impl AsRef<[u8]>, member: impl AsRef<[u8]>) -> Result<bool>;
fn scard(&self, key: impl AsRef<[u8]>) -> Result<u64>;
fn spop(&self, key: impl AsRef<[u8]>, count: usize) -> Result<Vec<Vec<u8>>>;
}
pub trait ZSetOps {
fn zadd<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, members: &[(f64, M)]) -> Result<usize>;
fn zrem<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, members: &[M]) -> Result<usize>;
fn zscore(&self, key: impl AsRef<[u8]>, member: impl AsRef<[u8]>) -> Result<Option<f64>>;
fn zcard(&self, key: impl AsRef<[u8]>) -> Result<u64>;
fn zrank(&self, key: impl AsRef<[u8]>, member: impl AsRef<[u8]>) -> Result<Option<u64>>;
fn zrevrank(&self, key: impl AsRef<[u8]>, member: impl AsRef<[u8]>) -> Result<Option<u64>>;
fn zrange(&self, key: impl AsRef<[u8]>, start: i64, stop: i64) -> Result<Vec<(Vec<u8>, f64)>>;
fn zcount(&self, key: impl AsRef<[u8]>, spec: &RangeScoreSpec) -> Result<u64>;
fn zincrby(&self, key: impl AsRef<[u8]>, step: f64, member: impl AsRef<[u8]>) -> Result<f64>;
}