hibana 0.9.2

Session-typed choreographic programming for no_std Rust protocols, inspired by affine MPST
Documentation
use super::{Par, ProgramSourceData, ProgramTerm, Resolve, Roll, Route, Send, Seq};
use crate::global::steps::RoleLaneMask;

impl<const FROM: u8, const TO: u8, M> ProgramTerm for Send<FROM, TO, M>
where
    M: crate::global::Message,
{
    const PROGRAM_SOURCE: ProgramSourceData = {
        ProgramSourceData::from_parts(
            crate::global::const_dsl::const_send_typed::<FROM, TO, M, 0>(),
            RoleLaneMask::empty().with_role(FROM, 0).with_role(TO, 0),
            1,
        )
    };
}

impl<Left, Right> ProgramTerm for Seq<Left, Right>
where
    Left: ProgramTerm,
    Right: ProgramTerm,
{
    const PROGRAM_SOURCE: ProgramSourceData = ProgramSourceData::seq(
        <Left as ProgramTerm>::PROGRAM_SOURCE,
        <Right as ProgramTerm>::PROGRAM_SOURCE,
    );
}

impl<Left, Right> ProgramTerm for Route<Left, Right>
where
    Left: ProgramTerm,
    Right: ProgramTerm,
{
    const PROGRAM_SOURCE: ProgramSourceData = ProgramSourceData::route(
        <Left as ProgramTerm>::PROGRAM_SOURCE,
        <Right as ProgramTerm>::PROGRAM_SOURCE,
    );
}

impl<Left, Right> ProgramTerm for Par<Left, Right>
where
    Left: ProgramTerm,
    Right: ProgramTerm,
{
    const PROGRAM_SOURCE: ProgramSourceData = ProgramSourceData::par(
        <Left as ProgramTerm>::PROGRAM_SOURCE,
        <Right as ProgramTerm>::PROGRAM_SOURCE,
    );
}

impl<Left, Right, const RESOLVER_ID: u16> ProgramTerm for Resolve<Route<Left, Right>, RESOLVER_ID>
where
    Left: ProgramTerm,
    Right: ProgramTerm,
{
    const PROGRAM_SOURCE: ProgramSourceData = ProgramSourceData::resolve_route(
        <Route<Left, Right> as ProgramTerm>::PROGRAM_SOURCE,
        RESOLVER_ID,
    );
}

impl<Inner> ProgramTerm for Roll<Inner>
where
    Inner: ProgramTerm,
{
    const PROGRAM_SOURCE: ProgramSourceData =
        ProgramSourceData::roll(<Inner as ProgramTerm>::PROGRAM_SOURCE);
}