use crate::error::Result;
use crate::executor::CommandExecutor;
use async_trait::async_trait;
use bytes::Bytes;
use redis::{Cmd, ToRedisArgs};
#[async_trait]
pub trait StringCommands: CommandExecutor {
async fn lcs_len<K1: ToRedisArgs + Send, K2: ToRedisArgs + Send>(
&self,
key1: K1,
key2: K2,
) -> Result<i64> {
let mut cmd = Cmd::new();
cmd.arg("LCS").arg(key1).arg(key2).arg("LEN");
crate::value::to_i64(self.execute_command(cmd, None).await?)
}
async fn lcs<K1: ToRedisArgs + Send, K2: ToRedisArgs + Send>(
&self,
key1: K1,
key2: K2,
) -> Result<Bytes> {
let mut cmd = Cmd::new();
cmd.arg("LCS").arg(key1).arg(key2);
crate::value::to_bytes(self.execute_command(cmd, None).await?)
}
async fn lcs_idx<K1: ToRedisArgs + Send, K2: ToRedisArgs + Send>(
&self,
key1: K1,
key2: K2,
min_match_len: Option<i64>,
with_match_len: bool,
) -> Result<redis::Value> {
let mut cmd = Cmd::new();
cmd.arg("LCS").arg(key1).arg(key2).arg("IDX");
if let Some(m) = min_match_len {
cmd.arg("MINMATCHLEN").arg(m);
}
if with_match_len {
cmd.arg("WITHMATCHLEN");
}
self.execute_command(cmd, None).await
}
}
impl<T: CommandExecutor + ?Sized> StringCommands for T {}