Skip to main content

qubit_lock/double_checked/
executor_builder.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026.
4 *    Haixing Hu, Qubit Co. Ltd.
5 *
6 *    All rights reserved.
7 *
8 ******************************************************************************/
9//! Initial builder for [`super::DoubleCheckedLockExecutor`].
10//!
11//! # Author
12//!
13//! Haixing Hu
14
15use std::marker::PhantomData;
16
17use super::{
18    ExecutionLogger,
19    executor_lock_builder::ExecutorLockBuilder,
20};
21use crate::lock::Lock;
22
23/// Initial builder for [`super::DoubleCheckedLockExecutor`].
24///
25/// This state has no lock yet. Call [`Self::on`] to attach the lock.
26///
27/// # Author
28///
29/// Haixing Hu
30#[derive(Debug, Default, Clone)]
31pub struct ExecutorBuilder {
32    /// Logger carried forward to later builder states.
33    logger: ExecutionLogger,
34}
35
36impl ExecutorBuilder {
37    /// Configures logging when the double-checked condition is not met.
38    #[inline]
39    pub fn log_unmet_condition(mut self, level: log::Level, message: impl Into<String>) -> Self {
40        self.logger.set_unmet_condition(Some(level), message);
41        self
42    }
43
44    /// Configures logging when the prepare action fails.
45    #[inline]
46    pub fn log_prepare_failure(
47        mut self,
48        level: log::Level,
49        message_prefix: impl Into<String>,
50    ) -> Self {
51        self.logger.set_prepare_failure(Some(level), message_prefix);
52        self
53    }
54
55    /// Configures logging when the prepare commit action fails.
56    #[inline]
57    pub fn log_prepare_commit_failure(
58        mut self,
59        level: log::Level,
60        message_prefix: impl Into<String>,
61    ) -> Self {
62        self.logger
63            .set_prepare_commit_failure(Some(level), message_prefix);
64        self
65    }
66
67    /// Configures logging when the prepare rollback action fails.
68    #[inline]
69    pub fn log_prepare_rollback_failure(
70        mut self,
71        level: log::Level,
72        message_prefix: impl Into<String>,
73    ) -> Self {
74        self.logger
75            .set_prepare_rollback_failure(Some(level), message_prefix);
76        self
77    }
78
79    /// Attaches the lock protected by this executor.
80    ///
81    /// # Parameters
82    ///
83    /// * `lock` - The lock handle. Arc-based lock wrappers can be cloned and
84    ///   stored here for reusable execution.
85    ///
86    /// # Returns
87    ///
88    /// The builder state that can configure the required tester.
89    #[inline]
90    pub fn on<L, T>(self, lock: L) -> ExecutorLockBuilder<L, T>
91    where
92        L: Lock<T>,
93    {
94        ExecutorLockBuilder {
95            lock,
96            logger: self.logger,
97            _phantom: PhantomData,
98        }
99    }
100}