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}