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) catch_panics: bool,
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 disable_unmet_condition_logging(mut self) -> Self {
self.logger.disable_unmet_condition();
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 disable_prepare_failure_logging(mut self) -> Self {
self.logger.disable_prepare_failure();
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 disable_prepare_commit_failure_logging(mut self) -> Self {
self.logger.disable_prepare_commit_failure();
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 disable_prepare_rollback_failure_logging(mut self) -> Self {
self.logger.disable_prepare_rollback_failure();
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,
catch_panics: self.catch_panics,
_phantom: PhantomData,
}
}
#[inline]
pub fn catch_panics(mut self) -> Self {
self.catch_panics = true;
self
}
#[inline]
pub fn set_catch_panics(mut self, catch_panics: bool) -> Self {
self.catch_panics = catch_panics;
self
}
#[inline]
pub fn disable_catch_panics(mut self) -> Self {
self.catch_panics = false;
self
}
}