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 54)
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!(
35        "Initial state: running = {}",
36        running.load(Ordering::Acquire)
37    );
38    println!("Initial data: {}", data.read(|d| *d));
39
40    let executor = DoubleCheckedLockExecutor::builder()
41        .on(data.clone())
42        .when({
43            let running = running.clone();
44            move || running.load(Ordering::Acquire)
45        })
46        .build();
47
48    // Try to execute when service is not running (should fail)
49    let result = executor
50        .call_with(|value: &mut i32| {
51            *value += 1;
52            Ok::<_, std::io::Error>(*value)
53        })
54        .get_result();
55
56    if result.is_success() {
57        println!("Unexpected success: {}", result.unwrap());
58    } else {
59        println!("Expected failure: Condition not met.");
60    }
61
62    // Start the service
63    running.store(true, Ordering::Release);
64    println!(
65        "Service started: running = {}",
66        running.load(Ordering::Acquire)
67    );
68
69    // Now execute should succeed
70    let result = executor
71        .call_with(|value: &mut i32| {
72            *value += 1;
73            Ok::<_, std::io::Error>(*value)
74        })
75        .get_result();
76
77    if result.is_success() {
78        println!("Success: new value = {}", result.unwrap());
79    } else {
80        println!("Unexpected failure: {:?}", result);
81    }
82
83    // Verify the data was updated
84    println!("Final data: {}", data.read(|d| *d));
85
86    // Stop the service
87    running.store(false, Ordering::Release);
88    println!(
89        "Service stopped: running = {}",
90        running.load(Ordering::Acquire)
91    );
92
93    // Try to execute when service is stopped (should fail)
94    let result = executor
95        .call_with(|value: &mut i32| {
96            *value += 1;
97            Ok::<_, std::io::Error>(*value)
98        })
99        .get_result();
100
101    if result.is_success() {
102        println!("Unexpected success: {}", result.unwrap());
103    } else {
104        println!("Expected failure: Condition not met.");
105    }
106
107    Ok(())
108}
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.