pub enum ExecutionResult<T, E>where
E: Display,{
Success(T),
ConditionNotMet,
Failed(ExecutorError<E>),
}Expand description
Task execution result
Represents the result of executing a task using an enum to clearly distinguish between success, unmet conditions, and failure.
§Type Parameters
T- The type of the return value when execution succeedsE- The type of the error when execution fails
§Examples
use qubit_dcl::double_checked::{ExecutionResult, ExecutorError};
let success: ExecutionResult<i32, String> = ExecutionResult::success(42);
if let ExecutionResult::Success(val) = success {
println!("Value: {}", val);
}
let unmet: ExecutionResult<i32, String> = ExecutionResult::unmet();
let failed: ExecutionResult<i32, String> =
ExecutionResult::task_failed("Task failed".to_string());§Author
Haixing Hu
Variants§
Success(T)
Execution succeeded with a value
ConditionNotMet
Double-checked locking condition was not met
Failed(ExecutorError<E>)
Execution failed with an error
Implementations§
Source§impl<T, E> ExecutionResult<T, E>where
E: Display,
impl<T, E> ExecutionResult<T, E>where
E: Display,
Sourcepub fn success(value: T) -> Self
pub fn success(value: T) -> Self
Builds ExecutionResult::Success with value.
§Parameters
value- Successful task value.
§Returns
A success result containing value.
Sourcepub fn unmet() -> Self
pub fn unmet() -> Self
Builds ExecutionResult::ConditionNotMet.
§Returns
A result representing a failed double-check condition.
Sourcepub fn task_failed(err: E) -> Self
pub fn task_failed(err: E) -> Self
Builds a failed result with ExecutorError::TaskFailed.
§Parameters
err- Error returned by the executed task.
§Returns
A failed result wrapping the task error.
Sourcepub fn prepare_failed(msg: impl Display) -> Self
pub fn prepare_failed(msg: impl Display) -> Self
Builds a failed result with ExecutorError::PrepareFailed.
Accepts any fmt::Display value (including std::error::Error and String);
the message is stored as a String via ToString.
§Parameters
msg- Prepare error message or displayable error value.
§Returns
A failed result containing the prepare failure message.
Sourcepub fn prepare_commit_failed(msg: impl Display) -> Self
pub fn prepare_commit_failed(msg: impl Display) -> Self
Builds a failed result with ExecutorError::PrepareCommitFailed.
§Parameters
msg- Commit error message or displayable error value.
§Returns
A failed result containing the prepare-commit failure message.
Sourcepub fn prepare_rollback_failed(
original: impl Into<String>,
rollback: impl Into<String>,
) -> Self
pub fn prepare_rollback_failed( original: impl Into<String>, rollback: impl Into<String>, ) -> Self
Builds a failed result with ExecutorError::PrepareRollbackFailed.
§Parameters
original- Original failure that triggered prepare rollback.rollback- Failure produced by the rollback action.
§Returns
A failed result containing both original and rollback messages.
Sourcepub fn lock_poisoned(msg: impl Into<String>) -> Self
pub fn lock_poisoned(msg: impl Into<String>) -> Self
Builds a failed result with ExecutorError::LockPoisoned.
§Parameters
msg- Lock poisoning diagnostic message.
§Returns
A failed result containing the lock poisoning message.
Sourcepub fn from_executor_error(err: ExecutorError<E>) -> Self
pub fn from_executor_error(err: ExecutorError<E>) -> Self
Wraps an arbitrary ExecutorError as ExecutionResult::Failed.
§Parameters
err- Executor error to store in the failed result.
§Returns
A failed result containing err.
Sourcepub fn is_success(&self) -> bool
pub fn is_success(&self) -> bool
Examples found in repository?
38fn main() -> Result<(), Box<dyn std::error::Error>> {
39 // Create shared state
40 let running = Arc::new(AtomicBool::new(false));
41 let data = ArcMutex::new(42);
42
43 println!(
44 "Initial state: running = {}",
45 running.load(Ordering::Acquire)
46 );
47 println!("Initial data: {}", data.read(|d| *d));
48
49 let executor = DoubleCheckedLockExecutor::builder()
50 .on(data.clone())
51 .when({
52 let running = running.clone();
53 move || running.load(Ordering::Acquire)
54 })
55 .build();
56
57 // Try to execute when service is not running (should fail)
58 let result = executor
59 .call_with(|value: &mut i32| {
60 *value += 1;
61 Ok::<_, ServiceError>(*value)
62 })
63 .get_result();
64
65 if result.is_success() {
66 println!("Unexpected success: {}", result.unwrap());
67 } else {
68 println!("Expected failure: Condition not met.");
69 }
70
71 // Start the service
72 running.store(true, Ordering::Release);
73 println!(
74 "Service started: running = {}",
75 running.load(Ordering::Acquire)
76 );
77
78 // Now execute should succeed
79 let result = executor
80 .call_with(|value: &mut i32| {
81 *value += 1;
82 Ok::<_, ServiceError>(*value)
83 })
84 .get_result();
85
86 if result.is_success() {
87 println!("Success: new value = {}", result.unwrap());
88 } else {
89 println!("Unexpected failure: {:?}", result);
90 }
91
92 // Verify the data was updated
93 println!("Final data: {}", data.read(|d| *d));
94
95 // Stop the service
96 running.store(false, Ordering::Release);
97 println!(
98 "Service stopped: running = {}",
99 running.load(Ordering::Acquire)
100 );
101
102 // Try to execute when service is stopped (should fail)
103 let result = executor
104 .call_with(|value: &mut i32| {
105 *value += 1;
106 Ok::<_, ServiceError>(*value)
107 })
108 .get_result();
109
110 if result.is_success() {
111 println!("Unexpected success: {}", result.unwrap());
112 } else {
113 println!("Expected failure: Condition not met.");
114 }
115
116 Ok(())
117}Sourcepub fn is_unmet(&self) -> bool
pub fn is_unmet(&self) -> bool
Checks if the condition was not met
§Returns
true if this result is ExecutionResult::ConditionNotMet.
Sourcepub fn unwrap(self) -> T
pub fn unwrap(self) -> T
Unwraps the success value, panicking if not successful
§Returns
The success value stored in ExecutionResult::Success.
§Panics
Panics if this result is ExecutionResult::ConditionNotMet or
ExecutionResult::Failed.
Examples found in repository?
38fn main() -> Result<(), Box<dyn std::error::Error>> {
39 // Create shared state
40 let running = Arc::new(AtomicBool::new(false));
41 let data = ArcMutex::new(42);
42
43 println!(
44 "Initial state: running = {}",
45 running.load(Ordering::Acquire)
46 );
47 println!("Initial data: {}", data.read(|d| *d));
48
49 let executor = DoubleCheckedLockExecutor::builder()
50 .on(data.clone())
51 .when({
52 let running = running.clone();
53 move || running.load(Ordering::Acquire)
54 })
55 .build();
56
57 // Try to execute when service is not running (should fail)
58 let result = executor
59 .call_with(|value: &mut i32| {
60 *value += 1;
61 Ok::<_, ServiceError>(*value)
62 })
63 .get_result();
64
65 if result.is_success() {
66 println!("Unexpected success: {}", result.unwrap());
67 } else {
68 println!("Expected failure: Condition not met.");
69 }
70
71 // Start the service
72 running.store(true, Ordering::Release);
73 println!(
74 "Service started: running = {}",
75 running.load(Ordering::Acquire)
76 );
77
78 // Now execute should succeed
79 let result = executor
80 .call_with(|value: &mut i32| {
81 *value += 1;
82 Ok::<_, ServiceError>(*value)
83 })
84 .get_result();
85
86 if result.is_success() {
87 println!("Success: new value = {}", result.unwrap());
88 } else {
89 println!("Unexpected failure: {:?}", result);
90 }
91
92 // Verify the data was updated
93 println!("Final data: {}", data.read(|d| *d));
94
95 // Stop the service
96 running.store(false, Ordering::Release);
97 println!(
98 "Service stopped: running = {}",
99 running.load(Ordering::Acquire)
100 );
101
102 // Try to execute when service is stopped (should fail)
103 let result = executor
104 .call_with(|value: &mut i32| {
105 *value += 1;
106 Ok::<_, ServiceError>(*value)
107 })
108 .get_result();
109
110 if result.is_success() {
111 println!("Unexpected success: {}", result.unwrap());
112 } else {
113 println!("Expected failure: Condition not met.");
114 }
115
116 Ok(())
117}Sourcepub fn into_result(self) -> Result<Option<T>, ExecutorError<E>>
pub fn into_result(self) -> Result<Option<T>, ExecutorError<E>>
Converts the result to a standard Result
§Returns
Ok(Some(T))- If execution was successfulOk(None)- If condition was not metErr(ExecutorError<E>)- If execution failed
§Errors
Returns the stored ExecutorError when this value is
ExecutionResult::Failed.