ParallelStateMachine

Struct ParallelStateMachine 

Source
pub struct ParallelStateMachine<S, E, C>
where S: State, E: Event, C: Context,
{ pub(crate) regions: Vec<StateMachine<S, E, C>>, }

Fields§

§regions: Vec<StateMachine<S, E, C>>

Implementations§

Source§

impl<S, E, C> ParallelStateMachine<S, E, C>
where S: State, E: Event, C: Context,

Source

pub fn new() -> Self

Examples found in repository?
examples/order_example.rs (line 448)
418fn parallel_example() {
419    println!("\n=== Parallel Regions Example ===");
420
421    // Order processing region
422    let mut order_builder =
423        StateMachineBuilderFactory::create::<OrderState, OrderEvent, OrderContext>();
424    order_builder
425        .external_transition()
426        .from(OrderState::New)
427        .to(OrderState::Processing)
428        .on(OrderEvent::Process)
429        .perform(|_s, _e, ctx| {
430            println!("Order region: Processing order {}", ctx.order_id);
431        });
432
433    // Payment processing region (using same states/events for simplicity)
434    let mut payment_builder =
435        StateMachineBuilderFactory::create::<OrderState, OrderEvent, OrderContext>();
436    payment_builder
437        .external_transition()
438        .from(OrderState::PaymentPending)
439        .to(OrderState::PaymentReceived)
440        .on(OrderEvent::ConfirmPayment)
441        .perform(|_s, _e, ctx| {
442            println!(
443                "Payment region: Payment confirmed for order {}",
444                ctx.order_id
445            );
446        });
447
448    let mut parallel_machine = ParallelStateMachine::new();
449    parallel_machine.add_region(order_builder.id("OrderRegion").build());
450    parallel_machine.add_region(payment_builder.id("PaymentRegion").build());
451
452    let context = OrderContext {
453        order_id: "ORD-PARALLEL".to_string(),
454        amount: 199.99,
455        customer_id: "CUST-P1".to_string(),
456    };
457
458    // Fire events in parallel regions
459    println!("Firing Process event in parallel regions:");
460    let results = parallel_machine.fire_event(
461        vec![OrderState::New, OrderState::PaymentPending],
462        OrderEvent::Process,
463        context.clone(),
464    );
465
466    for (i, result) in results.iter().enumerate() {
467        println!("  Region {}: {:?}", i, result);
468    }
469
470    println!("Firing ConfirmPayment event in parallel regions:");
471    let results = parallel_machine.fire_event(
472        vec![OrderState::Processing, OrderState::PaymentPending],
473        OrderEvent::ConfirmPayment,
474        context,
475    );
476
477    for (i, result) in results.iter().enumerate() {
478        println!("  Region {}: {:?}", i, result);
479    }
480}
Source

pub fn add_region(&mut self, machine: StateMachine<S, E, C>)

Examples found in repository?
examples/order_example.rs (line 449)
418fn parallel_example() {
419    println!("\n=== Parallel Regions Example ===");
420
421    // Order processing region
422    let mut order_builder =
423        StateMachineBuilderFactory::create::<OrderState, OrderEvent, OrderContext>();
424    order_builder
425        .external_transition()
426        .from(OrderState::New)
427        .to(OrderState::Processing)
428        .on(OrderEvent::Process)
429        .perform(|_s, _e, ctx| {
430            println!("Order region: Processing order {}", ctx.order_id);
431        });
432
433    // Payment processing region (using same states/events for simplicity)
434    let mut payment_builder =
435        StateMachineBuilderFactory::create::<OrderState, OrderEvent, OrderContext>();
436    payment_builder
437        .external_transition()
438        .from(OrderState::PaymentPending)
439        .to(OrderState::PaymentReceived)
440        .on(OrderEvent::ConfirmPayment)
441        .perform(|_s, _e, ctx| {
442            println!(
443                "Payment region: Payment confirmed for order {}",
444                ctx.order_id
445            );
446        });
447
448    let mut parallel_machine = ParallelStateMachine::new();
449    parallel_machine.add_region(order_builder.id("OrderRegion").build());
450    parallel_machine.add_region(payment_builder.id("PaymentRegion").build());
451
452    let context = OrderContext {
453        order_id: "ORD-PARALLEL".to_string(),
454        amount: 199.99,
455        customer_id: "CUST-P1".to_string(),
456    };
457
458    // Fire events in parallel regions
459    println!("Firing Process event in parallel regions:");
460    let results = parallel_machine.fire_event(
461        vec![OrderState::New, OrderState::PaymentPending],
462        OrderEvent::Process,
463        context.clone(),
464    );
465
466    for (i, result) in results.iter().enumerate() {
467        println!("  Region {}: {:?}", i, result);
468    }
469
470    println!("Firing ConfirmPayment event in parallel regions:");
471    let results = parallel_machine.fire_event(
472        vec![OrderState::Processing, OrderState::PaymentPending],
473        OrderEvent::ConfirmPayment,
474        context,
475    );
476
477    for (i, result) in results.iter().enumerate() {
478        println!("  Region {}: {:?}", i, result);
479    }
480}
Source

pub fn fire_event( &self, states: Vec<S>, event: E, context: C, ) -> Vec<Result<S, TransitionError>>

Examples found in repository?
examples/order_example.rs (lines 460-464)
418fn parallel_example() {
419    println!("\n=== Parallel Regions Example ===");
420
421    // Order processing region
422    let mut order_builder =
423        StateMachineBuilderFactory::create::<OrderState, OrderEvent, OrderContext>();
424    order_builder
425        .external_transition()
426        .from(OrderState::New)
427        .to(OrderState::Processing)
428        .on(OrderEvent::Process)
429        .perform(|_s, _e, ctx| {
430            println!("Order region: Processing order {}", ctx.order_id);
431        });
432
433    // Payment processing region (using same states/events for simplicity)
434    let mut payment_builder =
435        StateMachineBuilderFactory::create::<OrderState, OrderEvent, OrderContext>();
436    payment_builder
437        .external_transition()
438        .from(OrderState::PaymentPending)
439        .to(OrderState::PaymentReceived)
440        .on(OrderEvent::ConfirmPayment)
441        .perform(|_s, _e, ctx| {
442            println!(
443                "Payment region: Payment confirmed for order {}",
444                ctx.order_id
445            );
446        });
447
448    let mut parallel_machine = ParallelStateMachine::new();
449    parallel_machine.add_region(order_builder.id("OrderRegion").build());
450    parallel_machine.add_region(payment_builder.id("PaymentRegion").build());
451
452    let context = OrderContext {
453        order_id: "ORD-PARALLEL".to_string(),
454        amount: 199.99,
455        customer_id: "CUST-P1".to_string(),
456    };
457
458    // Fire events in parallel regions
459    println!("Firing Process event in parallel regions:");
460    let results = parallel_machine.fire_event(
461        vec![OrderState::New, OrderState::PaymentPending],
462        OrderEvent::Process,
463        context.clone(),
464    );
465
466    for (i, result) in results.iter().enumerate() {
467        println!("  Region {}: {:?}", i, result);
468    }
469
470    println!("Firing ConfirmPayment event in parallel regions:");
471    let results = parallel_machine.fire_event(
472        vec![OrderState::Processing, OrderState::PaymentPending],
473        OrderEvent::ConfirmPayment,
474        context,
475    );
476
477    for (i, result) in results.iter().enumerate() {
478        println!("  Region {}: {:?}", i, result);
479    }
480}
Source

pub fn get_region(&self, index: usize) -> Option<&StateMachine<S, E, C>>

Source

pub fn region_count(&self) -> usize

Auto Trait Implementations§

§

impl<S, E, C> Freeze for ParallelStateMachine<S, E, C>

§

impl<S, E, C> !RefUnwindSafe for ParallelStateMachine<S, E, C>

§

impl<S, E, C> Send for ParallelStateMachine<S, E, C>
where S: Send, E: Send,

§

impl<S, E, C> Sync for ParallelStateMachine<S, E, C>
where S: Sync + Send, E: Sync + Send,

§

impl<S, E, C> Unpin for ParallelStateMachine<S, E, C>
where S: Unpin, E: Unpin,

§

impl<S, E, C> !UnwindSafe for ParallelStateMachine<S, E, C>

Blanket Implementations§

§

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

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

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

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

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

§

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

Mutably borrows from an owned value. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

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

§

fn into(self) -> U

Calls U::from(self).

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

§

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

§

type Error = Infallible

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

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

Performs the conversion.
§

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

§

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

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

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

Performs the conversion.