hibana 0.9.9

Choreographic programming in Rust with no_std and no heap allocation
Documentation
use super::{ScopeId, ScopeKind};

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) struct DynamicRouteResolver {
    resolver_id: u16,
    scope: ScopeId,
}

impl DynamicRouteResolver {
    pub(crate) const fn new(scope: ScopeId, resolver_id: u16) -> Self {
        if !matches!(scope.kind(), Some(ScopeKind::Route)) {
            crate::invariant();
        }
        Self { resolver_id, scope }
    }

    pub(crate) const fn resolver_id(self) -> u16 {
        self.resolver_id
    }

    pub(crate) const fn scope(self) -> ScopeId {
        self.scope
    }
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[cfg_attr(kani, derive(kani::Arbitrary))]
pub(crate) enum ReentryMark {
    SinglePass,
    Reentrant,
}

impl ReentryMark {
    pub(crate) const fn is_reentrant(self) -> bool {
        matches!(self, Self::Reentrant)
    }
}

#[derive(Clone, Copy)]
pub(crate) struct RouteResolverMarker {
    pub(crate) scope: ScopeId,
    pub(crate) resolver_id: u16,
}

impl RouteResolverMarker {
    pub(crate) const fn new(scope: ScopeId, resolver_id: u16) -> Self {
        let _ = DynamicRouteResolver::new(scope, resolver_id);
        Self { scope, resolver_id }
    }

    pub(crate) const fn resolver(self) -> DynamicRouteResolver {
        DynamicRouteResolver::new(self.scope, self.resolver_id)
    }
}