use crate::{ error::Error, jobs::{Deliver, JobState}, }; use activitystreams::url::Url; use background_jobs::ActixJob; use std::future::{ready, Ready}; #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] pub(crate) struct DeliverMany { to: Vec, data: serde_json::Value, } impl DeliverMany { pub(crate) fn new(to: Vec, data: T) -> Result where T: serde::ser::Serialize, { Ok(DeliverMany { to, data: serde_json::to_value(data)?, }) } #[tracing::instrument(name = "Deliver many")] fn perform(self, state: JobState) -> Result<(), Error> { for inbox in self.to { state .job_server .queue(Deliver::new(inbox, self.data.clone())?)?; } Ok(()) } } impl ActixJob for DeliverMany { type State = JobState; type Future = Ready>; const NAME: &'static str = "relay::jobs::DeliverMany"; fn run(self, state: Self::State) -> Self::Future { ready(self.perform(state).map_err(Into::into)) } }