use super::{ControllerError, ControllerSpec, core::ControllerHandle};
use crate::{TaskId, TaskWaiter};
#[must_use = "a prepared submission starts no work until a submit method consumes it"]
pub struct PreparedSubmission {
controller: ControllerHandle,
id: TaskId,
spec: ControllerSpec,
}
impl PreparedSubmission {
pub(crate) fn new(controller: ControllerHandle, spec: ControllerSpec) -> Self {
Self {
controller,
id: TaskId::next(),
spec,
}
}
#[must_use]
pub fn id(&self) -> TaskId {
self.id
}
#[must_use = "use the prepared controller specification"]
pub fn spec(&self) -> &ControllerSpec {
&self.spec
}
pub async fn submit(self) -> Result<TaskId, ControllerError> {
let Self {
controller,
id,
spec,
} = self;
controller.submit_prepared(id, spec).await
}
pub fn try_submit(self) -> Result<TaskId, ControllerError> {
let Self {
controller,
id,
spec,
} = self;
controller.try_submit_prepared(id, spec)
}
pub async fn submit_and_watch(self) -> Result<(TaskId, TaskWaiter), ControllerError> {
let Self {
controller,
id,
spec,
} = self;
let (submitted_id, rx) = controller.submit_prepared_and_watch(id, spec).await?;
Ok((submitted_id, TaskWaiter::new(submitted_id, rx)))
}
pub fn try_submit_and_watch(self) -> Result<(TaskId, TaskWaiter), ControllerError> {
let Self {
controller,
id,
spec,
} = self;
let (submitted_id, rx) = controller.try_submit_prepared_and_watch(id, spec)?;
Ok((submitted_id, TaskWaiter::new(submitted_id, rx)))
}
}
impl std::fmt::Debug for PreparedSubmission {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("PreparedSubmission")
.field("id", &self.id)
.field("spec", &self.spec)
.finish_non_exhaustive()
}
}