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}