use futures_core::Stream;
use crate::{
backend::Backend,
task::{status::Status, task_id::TaskId},
};
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone)]
pub struct TaskResult<T> {
pub task_id: TaskId,
pub attempt: usize,
pub status: Status,
pub result: Result<T, String>,
}
impl<T> TaskResult<T> {
pub fn task_id(&self) -> &TaskId {
&self.task_id
}
pub fn status(&self) -> &Status {
&self.status
}
pub fn result(&self) -> &Result<T, String> {
&self.result
}
pub fn take(self) -> Result<T, String> {
self.result
}
}
pub trait WaitForCompletion<Output>: Backend {
type ResultStream: Stream<Item = Result<TaskResult<Output>, Self::Error>> + Send + 'static;
fn wait_for(&mut self, task_ids: impl IntoIterator<Item = TaskId>) -> Self::ResultStream;
fn wait_for_single(&mut self, task_id: TaskId) -> Self::ResultStream {
self.wait_for(std::iter::once(task_id))
}
fn check_status(
&mut self,
task_ids: impl IntoIterator<Item = TaskId> + Send,
) -> impl Future<Output = Result<Vec<TaskResult<Output>>, Self::Error>> + Send;
}