use futures_core::future::BoxFuture;
use serde::{de::DeserializeOwned, Deserialize, Serialize};
use crate::connection::Error;
mod base;
mod hash;
mod strings;
#[derive(Debug)]
pub struct CommandHelper<T: RawCommand>(pub T);
#[derive(Debug)]
pub struct Mutex<T>(tokio::sync::Mutex<T>);
#[derive(Debug, Deserialize)]
enum OkResp {
OK,
}
pub trait RawCommand: Send + Sync {
fn raw_command<'a, Req, Resp>(&'a self, request: Req) -> BoxFuture<'a, Result<Resp, Error>>
where
Req: Serialize + Send + 'a,
Resp: DeserializeOwned + 'a;
}
pub trait RawCommandMut: Send {
fn raw_command<'de, Req, Resp>(
&'de mut self,
request: Req,
) -> BoxFuture<'de, Result<Resp, Error>>
where
Req: Serialize + Send + 'de,
Resp: Deserialize<'de> + 'de;
fn command(self) -> CommandHelper<Mutex<Self>>
where
Self: Sized,
{
CommandHelper(Mutex::new(self))
}
}
impl<T: RawCommand> CommandHelper<T> {
pub async fn raw_command<Req, Resp>(&self, request: Req) -> Result<Resp, Error>
where
Req: Serialize + Send,
Resp: DeserializeOwned,
{
self.0.raw_command(request).await
}
}
impl<T: RawCommand> From<T> for CommandHelper<T> {
fn from(v: T) -> Self {
CommandHelper(v)
}
}
impl<T> Mutex<T> {
pub fn new(value: T) -> Self {
Mutex(tokio::sync::Mutex::new(value))
}
pub fn get_mut(&mut self) -> &mut T {
self.0.get_mut()
}
pub fn into_inner(self) -> T {
self.0.into_inner()
}
}
impl<T: RawCommandMut> RawCommand for Mutex<T> {
fn raw_command<'a, Req, Resp>(&'a self, request: Req) -> BoxFuture<'a, Result<Resp, Error>>
where
Req: Serialize + Send + 'a,
Resp: DeserializeOwned,
{
Box::pin(async move { self.0.lock().await.raw_command(request).await })
}
}
impl<T> From<T> for Mutex<T> {
fn from(v: T) -> Self {
Mutex(v.into())
}
}
impl<'r, T: RawCommand> RawCommand for &'r T {
fn raw_command<'a, Req, Resp>(&'a self, request: Req) -> BoxFuture<'a, Result<Resp, Error>>
where
Req: Serialize + Send + 'a,
Resp: DeserializeOwned + 'a,
{
(**self).raw_command(request)
}
}
impl<'a, T: RawCommandMut> RawCommandMut for &'a mut T {
fn raw_command<'de, Req, Resp>(
&'de mut self,
request: Req,
) -> BoxFuture<'de, Result<Resp, Error>>
where
Req: Serialize + Send + 'de,
Resp: Deserialize<'de> + 'de,
{
(**self).raw_command(request)
}
}