hibana 0.9.6

Choreography-derived runtime enforcement kernel for no_std Rust multiparty protocols
Documentation
use super::{
    Par, ProgramShape, ProgramSourceNode, Resolve, Roll, Route, Send, Seq, SourceRouteResolver,
    checked_source_count,
};

impl<const FROM: u8, const TO: u8, M> ProgramShape for Send<FROM, TO, M>
where
    M: crate::global::Message,
    M::Payload: crate::transport::wire::WireEncode + crate::transport::wire::WirePayload,
{
    const SOURCE_NODE: ProgramSourceNode = ProgramSourceNode::Send(crate::eff::EffAtom {
        from: FROM,
        to: TO,
        label: <M as crate::global::Message>::LOGICAL_LABEL,
        payload_schema: crate::global::payload_schema::<M>(),
        origin: crate::eff::EventOrigin::User,
        lane: 0,
    });
    const EVENT_COUNT: usize = 1;
    const SCOPE_MARKER_COUNT: usize = 0;
    const RESOLVER_MARKER_COUNT: usize = 0;
}

impl<Left, Right> ProgramShape for Seq<Left, Right>
where
    Left: ProgramShape,
    Right: ProgramShape,
{
    const SOURCE_NODE: ProgramSourceNode = ProgramSourceNode::Seq {
        left: &Left::SOURCE_NODE,
        right: &Right::SOURCE_NODE,
    };
    const EVENT_COUNT: usize = checked_source_count(Left::EVENT_COUNT, Right::EVENT_COUNT, 0);
    const SCOPE_MARKER_COUNT: usize =
        checked_source_count(Left::SCOPE_MARKER_COUNT, Right::SCOPE_MARKER_COUNT, 0);
    const RESOLVER_MARKER_COUNT: usize =
        checked_source_count(Left::RESOLVER_MARKER_COUNT, Right::RESOLVER_MARKER_COUNT, 0);
}

impl<Left, Right> ProgramShape for Route<Left, Right>
where
    Left: ProgramShape,
    Right: ProgramShape,
{
    const SOURCE_NODE: ProgramSourceNode = ProgramSourceNode::Route {
        left: &Left::SOURCE_NODE,
        right: &Right::SOURCE_NODE,
        resolver: SourceRouteResolver::Intrinsic,
    };
    const EVENT_COUNT: usize = checked_source_count(Left::EVENT_COUNT, Right::EVENT_COUNT, 0);
    const SCOPE_MARKER_COUNT: usize =
        checked_source_count(Left::SCOPE_MARKER_COUNT, Right::SCOPE_MARKER_COUNT, 4);
    const RESOLVER_MARKER_COUNT: usize =
        checked_source_count(Left::RESOLVER_MARKER_COUNT, Right::RESOLVER_MARKER_COUNT, 0);
}

impl<Left, Right> ProgramShape for Par<Left, Right>
where
    Left: ProgramShape,
    Right: ProgramShape,
{
    const SOURCE_NODE: ProgramSourceNode = ProgramSourceNode::Parallel {
        left: &Left::SOURCE_NODE,
        right: &Right::SOURCE_NODE,
    };
    const EVENT_COUNT: usize = checked_source_count(Left::EVENT_COUNT, Right::EVENT_COUNT, 0);
    const SCOPE_MARKER_COUNT: usize =
        checked_source_count(Left::SCOPE_MARKER_COUNT, Right::SCOPE_MARKER_COUNT, 3);
    const RESOLVER_MARKER_COUNT: usize =
        checked_source_count(Left::RESOLVER_MARKER_COUNT, Right::RESOLVER_MARKER_COUNT, 0);
}

impl<Left, Right, const RESOLVER_ID: u16> ProgramShape for Resolve<Route<Left, Right>, RESOLVER_ID>
where
    Left: ProgramShape,
    Right: ProgramShape,
{
    const SOURCE_NODE: ProgramSourceNode = ProgramSourceNode::Route {
        left: &Left::SOURCE_NODE,
        right: &Right::SOURCE_NODE,
        resolver: SourceRouteResolver::Dynamic(RESOLVER_ID),
    };
    const EVENT_COUNT: usize = <Route<Left, Right> as ProgramShape>::EVENT_COUNT;
    const SCOPE_MARKER_COUNT: usize = <Route<Left, Right> as ProgramShape>::SCOPE_MARKER_COUNT;
    const RESOLVER_MARKER_COUNT: usize = checked_source_count(
        <Route<Left, Right> as ProgramShape>::RESOLVER_MARKER_COUNT,
        0,
        1,
    );
}

impl<Inner> ProgramShape for Roll<Inner>
where
    Inner: ProgramShape,
{
    const SOURCE_NODE: ProgramSourceNode = ProgramSourceNode::Roll(&Inner::SOURCE_NODE);
    const EVENT_COUNT: usize = Inner::EVENT_COUNT;
    const SCOPE_MARKER_COUNT: usize = checked_source_count(Inner::SCOPE_MARKER_COUNT, 0, 2);
    const RESOLVER_MARKER_COUNT: usize = Inner::RESOLVER_MARKER_COUNT;
}