use core::convert::Infallible;
use crate::CircuitSendOutcome;
pub trait SubmissionPolicy<Submission, Output> {
type Failure;
fn settle(
&mut self,
submission: Submission,
) -> Result<CircuitSendOutcome<Output, Infallible>, Self::Failure>;
}
impl<Submission, Output, Policy: SubmissionPolicy<Submission, Output> + ?Sized>
SubmissionPolicy<Submission, Output> for &mut Policy
{
type Failure = Policy::Failure;
fn settle(
&mut self,
submission: Submission,
) -> Result<CircuitSendOutcome<Output, Infallible>, Self::Failure> {
(**self).settle(submission)
}
}
pub struct InlineSubmission;
impl<Output> SubmissionPolicy<Output, Output> for InlineSubmission {
type Failure = Infallible;
fn settle(
&mut self,
output: Output,
) -> Result<CircuitSendOutcome<Output, Infallible>, Infallible> {
Ok(CircuitSendOutcome::Immediate { from: output })
}
}
pub struct SubmitWith<Policy>(pub Policy);
impl<Submission, Output, Policy, Failure> SubmissionPolicy<Submission, Output>
for SubmitWith<Policy>
where
Policy: FnMut(Submission) -> Result<(), Failure>,
{
type Failure = Failure;
fn settle(
&mut self,
submission: Submission,
) -> Result<CircuitSendOutcome<Output, Infallible>, Failure> {
(self.0)(submission)?;
Ok(CircuitSendOutcome::Submitted)
}
}