Skip to main content

ExecutionContext

Struct ExecutionContext 

Source
pub struct ExecutionContext<T, E>
where E: Display,
{ /* private fields */ }
Expand description

Execution context (state after task execution)

This type provides result retrieval functionality after task execution.

Prepare lifecycle callbacks are configured on super::DoubleCheckedLockExecutor and are already applied before an ExecutionContext is returned. Task closures are responsible for their own rollback, cleanup, and commit logic.

§Type Parameters

  • T - The type of the task return value
  • E - The type of the task error

Implementations§

Source§

impl<T, E> ExecutionContext<T, E>
where E: Display,

Source

pub fn get_result(self) -> ExecutionResult<T, E>

Gets the execution result (consumes the context)

Prepare commit or rollback callbacks have already been executed by the builder before this context was created. This method does not trigger additional side effects.

§Returns

The owned ExecutionResult stored in this context.

Examples found in repository?
examples/double_checked_lock_executor_demo.rs (line 51)
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}
Source

pub fn peek_result(&self) -> &ExecutionResult<T, E>

Checks the execution result (does not consume the context)

§Returns

A shared reference to the stored ExecutionResult.

Source

pub fn is_success(&self) -> bool

Checks if execution was successful

§Returns

true if the stored result is ExecutionResult::Success.

Source§

impl<E> ExecutionContext<(), E>
where E: Display,

Source

pub fn finish(self) -> bool

Completes execution (for operations without return values)

Returns whether the execution was successful. This convenience method intentionally collapses both unmet conditions and execution failures to false; use Self::try_finish when the failure details must be preserved.

§Returns

true if the stored result is ExecutionResult::Success containing ().

Source

pub fn try_finish(self) -> Result<bool, ExecutorError<E>>

Completes execution while preserving failure details.

§Returns
  • Ok(true) - Execution succeeded with ().
  • Ok(false) - The double-checked condition was not met.
  • Err(ExecutorError<E>) - Execution failed, preserving the original executor error.
§Errors

Returns the stored ExecutorError when the underlying result is ExecutionResult::Failed.

Auto Trait Implementations§

§

impl<T, E> Freeze for ExecutionContext<T, E>
where T: Freeze, E: Freeze,

§

impl<T, E> RefUnwindSafe for ExecutionContext<T, E>

§

impl<T, E> Send for ExecutionContext<T, E>
where T: Send, E: Send,

§

impl<T, E> Sync for ExecutionContext<T, E>
where T: Sync, E: Sync,

§

impl<T, E> Unpin for ExecutionContext<T, E>
where T: Unpin, E: Unpin,

§

impl<T, E> UnsafeUnpin for ExecutionContext<T, E>
where T: UnsafeUnpin, E: UnsafeUnpin,

§

impl<T, E> UnwindSafe for ExecutionContext<T, E>
where T: UnwindSafe, E: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.