use super::{OfferScopeSelection, RouteArmToken, ingress::OfferIngressMode};
mod evidence;
mod planning;
pub(super) use self::evidence::{
OfferArmRecvEvidence, OfferControllerCursorArm, OfferControllerLocalEvidence,
OfferMaterializationReadiness, OfferPassiveEvidence, OfferPassiveReadySignal,
OfferPassiveRecvEvidence,
};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(in crate::endpoint::kernel) enum OfferScopeProfile {
ControllerIntrinsic,
ControllerDynamic,
PassiveIntrinsic,
PassiveDynamic,
}
#[derive(Clone, Copy, Eq, PartialEq)]
pub(super) enum OfferAuthorityPath {
ControllerResolver,
PassiveEvidence,
LocalSources,
}
#[derive(Clone, Copy)]
pub(in crate::endpoint::kernel) enum OfferEntryPosition {
RouteEntry,
AfterRouteEntry,
}
impl OfferEntryPosition {
#[inline]
pub(in crate::endpoint::kernel) const fn is_route_entry(self) -> bool {
matches!(self, Self::RouteEntry)
}
}
#[derive(Clone, Copy)]
pub(super) enum OfferCursorReadiness {
Recv,
NonRecv,
}
#[derive(Clone, Copy)]
pub(super) enum OfferControllerLocalReadiness {
Ready,
BlockedByMaterialization,
NeedsTransport,
}
#[derive(Clone, Copy)]
pub(super) enum OfferPassiveReadiness {
ReadyArm,
DynamicScopeWithoutRecv,
NeedsTransport,
}
#[derive(Clone, Copy)]
pub(super) struct OfferRouteShape {
pub(super) profile: OfferScopeProfile,
pub(super) entry: OfferEntryPosition,
pub(super) cursor: OfferCursorReadiness,
pub(super) controller: OfferControllerLocalReadiness,
pub(super) passive: OfferPassiveReadiness,
}
impl OfferRouteShape {
#[inline]
pub(super) const fn ingress_mode(self) -> OfferIngressMode {
match self.profile {
OfferScopeProfile::ControllerIntrinsic | OfferScopeProfile::ControllerDynamic => {
self.controller_ingress_mode()
}
OfferScopeProfile::PassiveIntrinsic | OfferScopeProfile::PassiveDynamic => {
self.passive_ingress_mode()
}
}
}
#[inline]
const fn controller_ingress_mode(self) -> OfferIngressMode {
if self.controller_resolved_without_frame() {
return OfferIngressMode::ResolvedWithoutFrame;
}
OfferIngressMode::TransportFrame
}
#[inline]
const fn passive_ingress_mode(self) -> OfferIngressMode {
if self.passive_resolved_without_frame() {
return OfferIngressMode::ResolvedWithoutFrame;
}
OfferIngressMode::TransportFrame
}
#[inline]
const fn controller_resolved_without_frame(self) -> bool {
if matches!(
self.controller,
OfferControllerLocalReadiness::BlockedByMaterialization
) {
return false;
}
match (self.entry, self.cursor) {
(OfferEntryPosition::RouteEntry, _) => {
self.profile.is_dynamic()
|| matches!(self.controller, OfferControllerLocalReadiness::Ready)
}
(OfferEntryPosition::AfterRouteEntry, OfferCursorReadiness::NonRecv) => true,
(OfferEntryPosition::AfterRouteEntry, OfferCursorReadiness::Recv) => false,
}
}
#[inline]
const fn passive_resolved_without_frame(self) -> bool {
matches!(
self.passive,
OfferPassiveReadiness::ReadyArm | OfferPassiveReadiness::DynamicScopeWithoutRecv
)
}
}
impl OfferScopeProfile {
#[inline]
pub(super) const fn is_controller(self) -> bool {
matches!(self, Self::ControllerIntrinsic | Self::ControllerDynamic)
}
#[inline]
pub(super) const fn is_passive(self) -> bool {
!self.is_controller()
}
#[inline]
pub(super) const fn is_dynamic(self) -> bool {
matches!(self, Self::ControllerDynamic | Self::PassiveDynamic)
}
#[inline]
pub(super) const fn authority_path(self) -> OfferAuthorityPath {
match self {
Self::ControllerDynamic => OfferAuthorityPath::ControllerResolver,
Self::PassiveIntrinsic | Self::PassiveDynamic => OfferAuthorityPath::PassiveEvidence,
Self::ControllerIntrinsic => OfferAuthorityPath::LocalSources,
}
}
#[inline]
pub(super) const fn transport_marks_ready_from_source(self, token: RouteArmToken) -> bool {
match self {
Self::PassiveDynamic => token.is_ack() || token.is_poll(),
Self::ControllerDynamic => token.is_resolver() || token.is_poll(),
Self::ControllerIntrinsic | Self::PassiveIntrinsic => false,
}
}
#[inline]
pub(super) const fn frame_evidence_is_branch_authority(self) -> bool {
matches!(self, Self::PassiveIntrinsic | Self::PassiveDynamic)
}
#[inline]
pub(super) const fn keeps_current_scope_for_unready_resolver(
self,
selection: OfferScopeSelection,
token: RouteArmToken,
) -> bool {
matches!(self, Self::ControllerDynamic)
&& !selection.entry_position.is_route_entry()
&& token.is_resolver()
}
#[inline]
pub(super) const fn intrinsic_passive_progress_after_defer(self) -> bool {
matches!(self, Self::PassiveIntrinsic)
}
#[inline]
pub(super) const fn poll_wire_commit_requires_event(self) -> bool {
self.is_dynamic()
}
#[inline]
pub(super) const fn poll_wire_commit_requires_intrinsic_observation(self) -> bool {
!self.is_dynamic()
}
#[inline]
pub(super) const fn publishes_controller_ack_decision(self) -> bool {
self.is_controller()
}
}