use crate::ValkeyResult;
use crate::cmd::Cmd;
use crate::executor::CommandExecutor;
use crate::value::FromValkeyValue;
use crate::value::ValkeyValue;
use crate::write::ToValkeyArgs;
use async_trait::async_trait;
use bytes::Bytes;
#[async_trait]
pub trait StringCommands: CommandExecutor {
async fn lcs_len<K1: ToValkeyArgs + Send, K2: ToValkeyArgs + Send>(
&self,
key1: K1,
key2: K2,
) -> ValkeyResult<i64> {
let mut cmd = Cmd::new();
cmd.arg("LCS").arg(key1).arg(key2).arg("LEN");
i64::from_owned_valkey_value(self.execute_command(cmd, None).await?)
}
async fn lcs<K1: ToValkeyArgs + Send, K2: ToValkeyArgs + Send>(
&self,
key1: K1,
key2: K2,
) -> ValkeyResult<Bytes> {
let mut cmd = Cmd::new();
cmd.arg("LCS").arg(key1).arg(key2);
Bytes::from_owned_valkey_value(self.execute_command(cmd, None).await?)
}
async fn lcs_idx<K1: ToValkeyArgs + Send, K2: ToValkeyArgs + Send>(
&self,
key1: K1,
key2: K2,
min_match_len: Option<i64>,
with_match_len: bool,
) -> ValkeyResult<ValkeyValue> {
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 {}