use crate::{
api::string::conf::{
DelEx, GetEx, Set, StringLCSArgs, StringLCSResult, StringMSetArgs, StringSetArgs,
},
error::Result,
traits::DbLike,
};
pub trait Kv: DbLike {
fn get<K: AsRef<[u8]>>(&self, key: K) -> Result<Option<Vec<u8>>>;
fn get_with_expire<K: AsRef<[u8]>>(&self, key: K) -> Result<(Option<Vec<u8>>, u64)>;
fn set<'a, K: AsRef<[u8]>, V: AsRef<[u8]>, O: AsRef<[Set<'a>]>>(
&self,
key: K,
val: V,
opts: O,
) -> Result<Option<Vec<u8>>>;
fn set_args<K: AsRef<[u8]>, V: AsRef<[u8]>>(
&self,
key: K,
val: V,
args: &StringSetArgs<'_>,
) -> Result<Option<Vec<u8>>>;
fn setex<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, val: V, expire_ms: u64) -> Result<()>;
fn setnx<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, val: V, expire_ms: u64) -> Result<bool>;
fn setxx<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, val: V, expire_ms: u64) -> Result<bool>;
fn getex<K: AsRef<[u8]>>(&self, key: K, opt: Option<GetEx>) -> Result<Option<Vec<u8>>>;
fn delex<K: AsRef<[u8]>>(&self, key: K, opt: DelEx<'_>) -> Result<bool>;
fn getset<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, val: V) -> Result<Option<Vec<u8>>>;
fn getdel<K: AsRef<[u8]>>(&self, key: K) -> Result<Option<Vec<u8>>>;
fn incrby_ex<K: AsRef<[u8]>>(
&self,
key: K,
increment: i64,
expire_ms: u64,
keep_ttl: bool,
) -> Result<i64>;
fn incr<K: AsRef<[u8]>>(&self, key: K) -> Result<i64>;
fn decr<K: AsRef<[u8]>>(&self, key: K) -> Result<i64>;
fn decrby<K: AsRef<[u8]>>(&self, key: K, decrement: i64) -> Result<i64>;
fn incrby<K: AsRef<[u8]>>(&self, key: K, increment: i64) -> Result<i64>;
fn incrbyfloat_ex<K: AsRef<[u8]>>(
&self,
key: K,
increment: f64,
expire_ms: u64,
keep_ttl: bool,
) -> Result<f64>;
fn incrbyfloat<K: AsRef<[u8]>>(&self, key: K, increment: f64) -> Result<f64>;
fn strlen<K: AsRef<[u8]>>(&self, key: K) -> Result<usize>;
fn append<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, val: V) -> Result<usize>;
fn getrange<K: AsRef<[u8]>>(&self, key: K, start: i64, end: i64) -> Result<Vec<u8>>;
fn setrange<K: AsRef<[u8]>, V: AsRef<[u8]>>(
&self,
key: K,
offset: usize,
val: V,
) -> Result<usize>;
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<()>;
fn mset_args<K: AsRef<[u8]>, V: AsRef<[u8]>>(
&self,
kvs: &[(K, V)],
args: StringMSetArgs,
) -> Result<bool>;
fn msetex<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, kvs: &[(K, V)], expire_ms: u64) -> Result<bool>;
fn msetnx<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, kvs: &[(K, V)]) -> Result<bool>;
fn cas<K: AsRef<[u8]>, V1: AsRef<[u8]>, V2: AsRef<[u8]>>(
&self,
key: K,
old_val: V1,
new_val: V2,
expire_ms: u64,
) -> Result<i32>;
fn cad<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, val: V) -> Result<i32>;
fn digest<K: AsRef<[u8]>>(&self, key: K) -> Result<Option<String>>;
fn lcs<K1: AsRef<[u8]>, K2: AsRef<[u8]>>(
&self,
key1: K1,
key2: K2,
args: StringLCSArgs,
) -> Result<StringLCSResult>;
}