use std::marker::PhantomData;
use qubit_function::Tester;
use super::{
ExecutionLogger,
executor_ready_builder::ExecutorReadyBuilder,
};
use crate::lock::Lock;
#[derive(Clone)]
pub struct ExecutorLockBuilder<L, T> {
pub(in crate::double_checked) lock: L,
pub(in crate::double_checked) logger: ExecutionLogger,
pub(in crate::double_checked) _phantom: PhantomData<fn() -> T>,
}
impl<L, T> ExecutorLockBuilder<L, T>
where
L: Lock<T>,
{
#[inline]
pub fn log_unmet_condition(mut self, level: log::Level, message: impl Into<String>) -> Self {
self.logger.set_unmet_condition(Some(level), message);
self
}
#[inline]
pub fn log_prepare_failure(
mut self,
level: log::Level,
message_prefix: impl Into<String>,
) -> Self {
self.logger.set_prepare_failure(Some(level), message_prefix);
self
}
#[inline]
pub fn log_prepare_commit_failure(
mut self,
level: log::Level,
message_prefix: impl Into<String>,
) -> Self {
self.logger
.set_prepare_commit_failure(Some(level), message_prefix);
self
}
#[inline]
pub fn log_prepare_rollback_failure(
mut self,
level: log::Level,
message_prefix: impl Into<String>,
) -> Self {
self.logger
.set_prepare_rollback_failure(Some(level), message_prefix);
self
}
#[inline]
pub fn when<Tst>(self, tester: Tst) -> ExecutorReadyBuilder<L, T>
where
Tst: Tester + Send + Sync + 'static,
{
ExecutorReadyBuilder {
lock: self.lock,
tester: tester.into_arc(),
logger: self.logger,
prepare_action: None,
rollback_prepare_action: None,
commit_prepare_action: None,
_phantom: PhantomData,
}
}
}