use std::{rc::Rc, sync::Arc};
use url::Url;
use crate::session::Session;
#[async_trait::async_trait(?Send)]
pub trait Deliver {
type Error: std::fmt::Display + 'static;
async fn deliver<T: serde::ser::Serialize, S: Session>(
&self,
inbox: &Url,
activity: &T,
session: S,
) -> Result<(), Self::Error>;
}
#[async_trait::async_trait(?Send)]
pub trait Deliverable: serde::ser::Serialize {
async fn deliver<D: Deliver, S: Session>(
&self,
inbox: &Url,
client: &D,
session: S,
) -> Result<(), D::Error>
where
Self: Sized,
{
client.deliver(inbox, self, session).await
}
}
#[async_trait::async_trait(?Send)]
impl<'a, D> Deliver for &'a D
where
D: Deliver,
{
type Error = D::Error;
async fn deliver<T: serde::ser::Serialize, S: Session>(
&self,
inbox: &Url,
activity: &T,
session: S,
) -> Result<(), Self::Error> {
D::deliver(self, inbox, activity, session).await
}
}
#[async_trait::async_trait(?Send)]
impl<'a, D> Deliver for &'a mut D
where
D: Deliver,
{
type Error = D::Error;
async fn deliver<T: serde::ser::Serialize, S: Session>(
&self,
inbox: &Url,
activity: &T,
session: S,
) -> Result<(), Self::Error> {
D::deliver(self, inbox, activity, session).await
}
}
#[async_trait::async_trait(?Send)]
impl<D> Deliver for Box<D>
where
D: Deliver,
{
type Error = D::Error;
async fn deliver<T: serde::ser::Serialize, S: Session>(
&self,
inbox: &Url,
activity: &T,
session: S,
) -> Result<(), Self::Error> {
D::deliver(self, inbox, activity, session).await
}
}
#[async_trait::async_trait(?Send)]
impl<D> Deliver for Rc<D>
where
D: Deliver,
{
type Error = D::Error;
async fn deliver<T: serde::ser::Serialize, S: Session>(
&self,
inbox: &Url,
activity: &T,
session: S,
) -> Result<(), Self::Error> {
D::deliver(self, inbox, activity, session).await
}
}
#[async_trait::async_trait(?Send)]
impl<D> Deliver for Arc<D>
where
D: Deliver,
{
type Error = D::Error;
async fn deliver<T: serde::ser::Serialize, S: Session>(
&self,
inbox: &Url,
activity: &T,
session: S,
) -> Result<(), Self::Error> {
D::deliver(self, inbox, activity, session).await
}
}