pub struct ExecutorReadyBuilder<L, T> { /* private fields */ }Expand description
Builder state after the required condition tester has been configured.
This state can configure prepare lifecycle callbacks and build the final
DoubleCheckedLockExecutor.
§Type Parameters
L- The lock type implementingLock<T>.T- The data type protected by the lock.
Implementations§
Source§impl<L, T> ExecutorReadyBuilder<L, T>where
L: Lock<T>,
impl<L, T> ExecutorReadyBuilder<L, T>where
L: Lock<T>,
Sourcepub fn log_unmet_condition(
self,
level: Level,
message: impl Into<String>,
) -> Self
pub fn log_unmet_condition( self, level: Level, message: impl Into<String>, ) -> Self
Sourcepub fn disable_unmet_condition_logging(self) -> Self
pub fn disable_unmet_condition_logging(self) -> Self
Disables logging when the double-checked condition is not met.
§Returns
This builder with unmet-condition logging disabled.
Sourcepub fn log_prepare_failure(
self,
level: Level,
message_prefix: impl Into<String>,
) -> Self
pub fn log_prepare_failure( self, level: Level, message_prefix: impl Into<String>, ) -> Self
Sourcepub fn disable_prepare_failure_logging(self) -> Self
pub fn disable_prepare_failure_logging(self) -> Self
Disables logging when the prepare action fails.
§Returns
This builder with prepare failure logging disabled.
Sourcepub fn log_prepare_commit_failure(
self,
level: Level,
message_prefix: impl Into<String>,
) -> Self
pub fn log_prepare_commit_failure( self, level: Level, message_prefix: impl Into<String>, ) -> Self
Sourcepub fn disable_prepare_commit_failure_logging(self) -> Self
pub fn disable_prepare_commit_failure_logging(self) -> Self
Disables logging when the prepare commit action fails.
§Returns
This builder with prepare-commit failure logging disabled.
Sourcepub fn log_prepare_rollback_failure(
self,
level: Level,
message_prefix: impl Into<String>,
) -> Self
pub fn log_prepare_rollback_failure( self, level: Level, message_prefix: impl Into<String>, ) -> Self
Sourcepub fn disable_prepare_rollback_failure_logging(self) -> Self
pub fn disable_prepare_rollback_failure_logging(self) -> Self
Disables logging when the prepare rollback action fails.
§Returns
This builder with prepare-rollback failure logging disabled.
Sourcepub fn prepare<Rn, E>(self, prepare_action: Rn) -> Self
pub fn prepare<Rn, E>(self, prepare_action: Rn) -> Self
Sets the prepare action.
The action runs after the first condition check succeeds and before the lock is acquired. If it succeeds, the executor will later run either rollback or commit according to the final task result.
Errors returned by this action are converted to String and reported
by execution methods as super::ExecutionResult::Failed.
§Parameters
prepare_action- The fallible action to run before locking.
§Returns
This builder with prepare configured.
§Errors
This builder method does not return errors. If prepare_action later
returns an error during execution, the execution result becomes
super::ExecutionResult::Failed with
super::ExecutorError::PrepareFailed.
Sourcepub fn rollback_prepare<Rn, E>(self, rollback_prepare_action: Rn) -> Self
pub fn rollback_prepare<Rn, E>(self, rollback_prepare_action: Rn) -> Self
Sets the rollback action for a successfully completed prepare action.
Errors returned by this action are converted to String and replace
the original execution result with a prepare-rollback failure.
§Parameters
rollback_prepare_action- The action to run if the second condition check or task execution fails after prepare succeeds.
§Returns
This builder with prepare rollback configured.
§Errors
This builder method does not return errors. If
rollback_prepare_action later returns an error during execution, the
execution result becomes super::ExecutionResult::Failed with
super::ExecutorError::PrepareRollbackFailed.
Sourcepub fn commit_prepare<Rn, E>(self, commit_prepare_action: Rn) -> Self
pub fn commit_prepare<Rn, E>(self, commit_prepare_action: Rn) -> Self
Sets the commit action for a successfully completed prepare action.
Errors returned by this action are converted to String and replace
an otherwise successful execution result with a prepare-commit failure.
§Parameters
commit_prepare_action- The action to run if the task succeeds after prepare succeeds.
§Returns
This builder with prepare commit configured.
§Errors
This builder method does not return errors. If commit_prepare_action
later returns an error during execution, the execution result becomes
super::ExecutionResult::Failed with
super::ExecutorError::PrepareCommitFailed.
Sourcepub fn catch_panics(self) -> Self
pub fn catch_panics(self) -> Self
Enables panic capture for tester, prepare callbacks, and task execution.
When enabled, panic payloads are converted to
super::executor_error::ExecutorError::Panic and surfaced through
super::ExecutionResult.
§Returns
This builder with panic capture enabled.
Sourcepub fn with_panic_capture(self, catch_panics: bool) -> Self
pub fn with_panic_capture(self, catch_panics: bool) -> Self
Sourcepub fn disable_catch_panics(self) -> Self
pub fn disable_catch_panics(self) -> Self
Disables panic capture for tester, prepare callbacks, and task execution.
§Returns
This builder with panic capture disabled.
Sourcepub fn build(self) -> DoubleCheckedLockExecutor<L, T>
pub fn build(self) -> DoubleCheckedLockExecutor<L, T>
Builds the reusable executor.
§Returns
A DoubleCheckedLockExecutor containing the configured lock, tester,
execution logger, and prepare lifecycle callbacks.
Examples found in repository?
29fn main() -> Result<(), Box<dyn std::error::Error>> {
30 // Create shared state
31 let running = Arc::new(AtomicBool::new(false));
32 let data = ArcMutex::new(42);
33
34 println!("Initial state: running = {}", running.load(Ordering::Acquire));
35 println!("Initial data: {}", data.read(|d| *d));
36
37 let executor = DoubleCheckedLockExecutor::builder()
38 .on(data.clone())
39 .when({
40 let running = running.clone();
41 move || running.load(Ordering::Acquire)
42 })
43 .build();
44
45 // Try to execute when service is not running (should fail)
46 let result = executor
47 .call_with(|value: &mut i32| {
48 *value += 1;
49 Ok::<_, std::io::Error>(*value)
50 })
51 .get_result();
52
53 if result.is_success() {
54 println!("Unexpected success: {}", result.unwrap());
55 } else {
56 println!("Expected failure: Condition not met.");
57 }
58
59 // Start the service
60 running.store(true, Ordering::Release);
61 println!("Service started: running = {}", running.load(Ordering::Acquire));
62
63 // Now execute should succeed
64 let result = executor
65 .call_with(|value: &mut i32| {
66 *value += 1;
67 Ok::<_, std::io::Error>(*value)
68 })
69 .get_result();
70
71 if result.is_success() {
72 println!("Success: new value = {}", result.unwrap());
73 } else {
74 println!("Unexpected failure: {:?}", result);
75 }
76
77 // Verify the data was updated
78 println!("Final data: {}", data.read(|d| *d));
79
80 // Stop the service
81 running.store(false, Ordering::Release);
82 println!("Service stopped: running = {}", running.load(Ordering::Acquire));
83
84 // Try to execute when service is stopped (should fail)
85 let result = executor
86 .call_with(|value: &mut i32| {
87 *value += 1;
88 Ok::<_, std::io::Error>(*value)
89 })
90 .get_result();
91
92 if result.is_success() {
93 println!("Unexpected success: {}", result.unwrap());
94 } else {
95 println!("Expected failure: Condition not met.");
96 }
97
98 Ok(())
99}