Skip to main content

qubit_dcl/double_checked/
double_checked_lock_builder.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026 Haixing Hu.
4 *
5 *    SPDX-License-Identifier: Apache-2.0
6 *
7 *    Licensed under the Apache License, Version 2.0.
8 *
9 ******************************************************************************/
10//! Convenience builder state for [`super::DoubleCheckedLock`].
11
12use qubit_function::Tester;
13
14use super::{
15    DoubleCheckedLockReadyBuilder,
16    executor_lock_builder::ExecutorLockBuilder,
17};
18use qubit_lock::Lock;
19
20/// Convenience builder state with lock attached.
21#[derive(Clone)]
22pub struct DoubleCheckedLockBuilder<L, T> {
23    /// Reusable-executor builder delegated to by the convenience API.
24    pub(in crate::double_checked) inner: ExecutorLockBuilder<L, T>,
25}
26
27impl<L, T> DoubleCheckedLockBuilder<L, T>
28where
29    L: Lock<T>,
30{
31    /// Configures logging when the double-checked condition is not met.
32    ///
33    /// # Parameters
34    ///
35    /// * `level` - Log level used for unmet-condition messages.
36    /// * `message` - Full log message emitted when the condition is not met.
37    ///
38    /// # Returns
39    ///
40    /// This builder with unmet-condition logging configured.
41    #[inline]
42    #[must_use = "assign or chain the returned builder"]
43    pub fn log_unmet_condition(mut self, level: log::Level, message: impl Into<String>) -> Self {
44        self.inner = self.inner.log_unmet_condition(level, message);
45        self
46    }
47
48    /// Disables logging when the double-checked condition is not met.
49    ///
50    /// # Returns
51    ///
52    /// This builder with unmet-condition logging disabled.
53    #[inline]
54    #[must_use = "assign or chain the returned builder"]
55    pub fn disable_unmet_condition_logging(mut self) -> Self {
56        self.inner = self.inner.disable_unmet_condition_logging();
57        self
58    }
59
60    /// Configures logging when the prepare action fails.
61    ///
62    /// # Parameters
63    ///
64    /// * `level` - Log level used for prepare failure messages.
65    /// * `message_prefix` - Prefix placed before the prepare failure text.
66    ///
67    /// # Returns
68    ///
69    /// This builder with prepare failure logging configured.
70    #[inline]
71    #[must_use = "assign or chain the returned builder"]
72    pub fn log_prepare_failure(mut self, level: log::Level, message_prefix: impl Into<String>) -> Self {
73        self.inner = self.inner.log_prepare_failure(level, message_prefix);
74        self
75    }
76
77    /// Disables logging when the prepare action fails.
78    ///
79    /// # Returns
80    ///
81    /// This builder with prepare failure logging disabled.
82    #[inline]
83    #[must_use = "assign or chain the returned builder"]
84    pub fn disable_prepare_failure_logging(mut self) -> Self {
85        self.inner = self.inner.disable_prepare_failure_logging();
86        self
87    }
88
89    /// Configures logging when the prepare commit action fails.
90    ///
91    /// # Parameters
92    ///
93    /// * `level` - Log level used for prepare-commit failure messages.
94    /// * `message_prefix` - Prefix placed before the prepare-commit failure
95    ///   text.
96    ///
97    /// # Returns
98    ///
99    /// This builder with prepare-commit failure logging configured.
100    #[inline]
101    #[must_use = "assign or chain the returned builder"]
102    pub fn log_prepare_commit_failure(mut self, level: log::Level, message_prefix: impl Into<String>) -> Self {
103        self.inner = self.inner.log_prepare_commit_failure(level, message_prefix);
104        self
105    }
106
107    /// Disables logging when the prepare commit action fails.
108    ///
109    /// # Returns
110    ///
111    /// This builder with prepare-commit failure logging disabled.
112    #[inline]
113    #[must_use = "assign or chain the returned builder"]
114    pub fn disable_prepare_commit_failure_logging(mut self) -> Self {
115        self.inner = self.inner.disable_prepare_commit_failure_logging();
116        self
117    }
118
119    /// Configures logging when the prepare rollback action fails.
120    ///
121    /// # Parameters
122    ///
123    /// * `level` - Log level used for prepare-rollback failure messages.
124    /// * `message_prefix` - Prefix placed before the prepare-rollback failure
125    ///   text.
126    ///
127    /// # Returns
128    ///
129    /// This builder with prepare-rollback failure logging configured.
130    #[inline]
131    #[must_use = "assign or chain the returned builder"]
132    pub fn log_prepare_rollback_failure(mut self, level: log::Level, message_prefix: impl Into<String>) -> Self {
133        self.inner = self.inner.log_prepare_rollback_failure(level, message_prefix);
134        self
135    }
136
137    /// Disables logging when the prepare rollback action fails.
138    ///
139    /// # Returns
140    ///
141    /// This builder with prepare-rollback failure logging disabled.
142    #[inline]
143    #[must_use = "assign or chain the returned builder"]
144    pub fn disable_prepare_rollback_failure_logging(mut self) -> Self {
145        self.inner = self.inner.disable_prepare_rollback_failure_logging();
146        self
147    }
148
149    /// Enables panic capture for tester, prepare callbacks, and task execution.
150    ///
151    /// # Returns
152    ///
153    /// This builder with panic capture enabled.
154    #[inline]
155    #[must_use = "assign or chain the returned builder"]
156    pub fn catch_panics(mut self) -> Self {
157        self.inner = self.inner.catch_panics();
158        self
159    }
160
161    /// Derives a builder with panic capture enabled or disabled for tester,
162    /// prepare callbacks, and task execution.
163    ///
164    /// # Parameters
165    ///
166    /// * `catch_panics` - `true` to capture panics as execution errors, or
167    ///   `false` to let panics unwind.
168    ///
169    /// # Returns
170    ///
171    /// A reconfigured builder with the updated panic-capture setting.
172    #[inline]
173    #[must_use = "assign or chain the returned builder"]
174    pub fn with_panic_capture(mut self, catch_panics: bool) -> Self {
175        self.inner = self.inner.with_panic_capture(catch_panics);
176        self
177    }
178
179    /// Disables panic capture for tester, prepare callbacks, and task execution.
180    ///
181    /// # Returns
182    ///
183    /// This builder with panic capture disabled.
184    #[inline]
185    #[must_use = "assign or chain the returned builder"]
186    pub fn disable_catch_panics(mut self) -> Self {
187        self.inner = self.inner.disable_catch_panics();
188        self
189    }
190
191    /// Sets the required double-checked condition.
192    ///
193    /// # Parameters
194    ///
195    /// * `tester` - Condition tester executed before and after acquiring the
196    ///   lock.
197    ///
198    /// # Returns
199    ///
200    /// A ready builder that can configure prepare callbacks or run the task.
201    #[inline]
202    #[must_use = "assign or chain the returned builder"]
203    pub fn when<Tst>(self, tester: Tst) -> DoubleCheckedLockReadyBuilder<L, T>
204    where
205        Tst: Tester + Send + Sync + 'static,
206    {
207        DoubleCheckedLockReadyBuilder {
208            inner: self.inner.when(tester),
209        }
210    }
211}