MagicStateMachines 0.1.2

Ergonomic typestate wrappers for compiler-enforced state machines with separable contracts
Documentation
use crate::{
    State, StateMachineImpl, StateMarker, StateStorage, StateTrait, StateUnionDiscriminant,
    StateUnionErased, StateUnionSharedEffect, StateUnionTransition,
};
use core::marker::PhantomData;

/// Proof that a state can transition through a generated state union.
#[doc(hidden)]
pub struct StateUnionTransitionProof<T, From, Marker, To>
where
    T: StateMachineImpl,
    From: StateTrait,
    Marker: StateUnionDiscriminant,
    To: StateTrait,
{
    marker: PhantomData<fn() -> (T, From, Marker, To)>,
}

impl<T, From, Marker, To> StateUnionTransitionProof<T, From, Marker, To>
where
    T: StateMachineImpl,
    From: StateTrait,
    Marker: StateUnionDiscriminant,
    To: StateTrait,
{
    #[doc(hidden)]
    #[must_use]
    pub fn new() -> Self {
        Self {
            marker: PhantomData,
        }
    }

    #[doc(hidden)]
    pub fn bind<Storage>(&self, _state: &State<Storage, T, From>)
    where
        Storage: StateStorage,
    {
    }
}

impl<T, From, Marker, To> Default for StateUnionTransitionProof<T, From, Marker, To>
where
    T: StateMachineImpl,
    From: StateTrait,
    Marker: StateUnionDiscriminant,
    To: StateTrait,
{
    fn default() -> Self {
        Self::new()
    }
}

/// Proves that a state can transition through a union marker to a concrete target.
#[doc(hidden)]
pub trait UnionTransitionProof<T, TUnion, TTo>: StateMarker
where
    T: StateMachineImpl,
    TUnion: StateUnionDiscriminant,
    TTo: crate::ConcreteStateTrait,
{
}

impl<T, From, TUnion, TTo> UnionTransitionProof<T, TUnion, TTo> for From
where
    T: StateMachineImpl,
    From: StateMarker + StateTrait + StateUnionErased<TUnion>,
    TUnion: StateUnionDiscriminant
        + StateUnionTransition<T::Standin, TTo>
        + StateUnionSharedEffect<T, TTo>,
    TTo: crate::ConcreteStateTrait,
{
}