use std::convert::Infallible;
use staticstr::StaticStr;
use crate::{Task, actions::Action, cancellation_token::CancellationToken, sources::Source};
use super::{HandleError, Job, Trigger, error_handling::ExponentialBackoff};
#[derive(bon::Builder, Debug)]
#[builder(finish_fn(
name = build_internal,
vis = ""
))]
pub struct SimpleJob<S, A, Tr, H> {
#[builder(start_fn, into)]
pub name: StaticStr,
#[builder(into)]
pub tag: Option<StaticStr>,
pub source: Option<S>,
pub action: Option<A>,
pub trigger: Tr,
pub error_handling: H,
#[builder(required)]
pub cancel_token: Option<CancellationToken>,
}
impl<S, A, Tr, H, State: simple_job_builder::State> SimpleJobBuilder<S, A, Tr, H, State>
where
S: Source,
A: Action,
Tr: Trigger,
H: HandleError<Tr>,
{
pub fn build(self) -> Job<Task<S, A, Infallible>, Tr, H>
where
State: simple_job_builder::IsComplete,
{
let SimpleJob {
name,
tag,
source,
action,
trigger,
error_handling,
cancel_token,
} = self.build_internal();
let task = Task::<S, A, Infallible>::builder(name.clone())
.maybe_tag(tag)
.maybe_source(source)
.maybe_action(action)
.maybe_cancel_token(cancel_token.clone())
.build_without_replies();
Job::builder(name)
.tasks(task)
.trigger(trigger)
.error_handling(error_handling)
.cancel_token(cancel_token)
.build()
}
}
impl<S, A, Tr, State: simple_job_builder::State>
SimpleJobBuilder<S, A, Tr, ExponentialBackoff, State>
where
S: Source,
A: Action,
Tr: Trigger,
{
pub fn build_with_default_error_handling(
self,
) -> Job<Task<S, A, Infallible>, Tr, ExponentialBackoff>
where
State::ErrorHandling: simple_job_builder::IsUnset,
State::Trigger: simple_job_builder::IsSet,
State::CancelToken: simple_job_builder::IsSet,
{
self.error_handling(ExponentialBackoff::new()).build()
}
}