use super::{
OfferControllerRecvStep, OfferControllerSkipEvidence, OfferControllerSkipReadiness,
OfferEntryPosition, OfferPassiveEvidence, OfferPassiveReadiness, OfferScopeProfile,
};
#[derive(Clone, Copy)]
enum OfferControllerSkipPlan {
SelfSendController,
NonEntryCursorReady,
BlockedByMaterialization,
NeedsTransport,
}
impl OfferControllerSkipPlan {
#[inline]
const fn readiness(self) -> OfferControllerSkipReadiness {
match self {
Self::SelfSendController | Self::NonEntryCursorReady => {
OfferControllerSkipReadiness::Ready
}
Self::BlockedByMaterialization => {
OfferControllerSkipReadiness::BlockedByMaterialization
}
Self::NeedsTransport => OfferControllerSkipReadiness::NeedsTransport,
}
}
}
#[derive(Clone, Copy)]
enum OfferPassivePlan {
ReadyArmOrFrameHint,
DynamicScopeWithoutRecv,
DynamicAckMaterializable,
NeedsTransport,
}
impl OfferPassivePlan {
#[inline]
const fn readiness(self) -> OfferPassiveReadiness {
match self {
Self::ReadyArmOrFrameHint => OfferPassiveReadiness::ReadyArmOrFrameHint,
Self::DynamicScopeWithoutRecv => OfferPassiveReadiness::DynamicScopeWithoutRecv,
Self::DynamicAckMaterializable => OfferPassiveReadiness::DynamicAckMaterializable,
Self::NeedsTransport => OfferPassiveReadiness::NeedsTransport,
}
}
}
impl OfferScopeProfile {
#[inline]
pub(in crate::endpoint::kernel::offer) const fn controller_recv_step(
self,
entry: OfferEntryPosition,
selected_peer: super::OfferCursorReadiness,
) -> OfferControllerRecvStep {
match self {
Self::ControllerStatic | Self::ControllerDynamic
if entry.is_after_route_entry()
&& matches!(selected_peer, super::OfferCursorReadiness::Recv) =>
{
OfferControllerRecvStep::SelectedPeerRecv
}
_ => OfferControllerRecvStep::NeedsTransportRecv,
}
}
#[inline]
const fn controller_skip_plan(
self,
evidence: OfferControllerSkipEvidence,
) -> OfferControllerSkipPlan {
match self {
Self::ControllerStatic | Self::ControllerDynamic
if evidence.materialization_pending() =>
{
OfferControllerSkipPlan::BlockedByMaterialization
}
Self::ControllerStatic | Self::ControllerDynamic if evidence.self_send_controller() => {
OfferControllerSkipPlan::SelfSendController
}
Self::ControllerStatic | Self::ControllerDynamic
if evidence.non_entry_cursor_ready() =>
{
OfferControllerSkipPlan::NonEntryCursorReady
}
_ => OfferControllerSkipPlan::NeedsTransport,
}
}
#[inline]
pub(in crate::endpoint::kernel::offer) const fn controller_skip_readiness(
self,
evidence: OfferControllerSkipEvidence,
) -> OfferControllerSkipReadiness {
self.controller_skip_plan(evidence).readiness()
}
#[inline]
const fn passive_plan(self, evidence: OfferPassiveEvidence) -> OfferPassivePlan {
match self {
Self::PassiveStatic if evidence.has_ready_signal() => {
OfferPassivePlan::ReadyArmOrFrameHint
}
Self::PassiveDynamic if evidence.has_ready_signal() => {
OfferPassivePlan::ReadyArmOrFrameHint
}
Self::PassiveDynamic if evidence.dynamic_scope_without_recv() => {
OfferPassivePlan::DynamicScopeWithoutRecv
}
Self::PassiveDynamic if evidence.ack_materializable() => {
OfferPassivePlan::DynamicAckMaterializable
}
_ => OfferPassivePlan::NeedsTransport,
}
}
#[inline]
pub(in crate::endpoint::kernel::offer) const fn passive_readiness(
self,
evidence: OfferPassiveEvidence,
) -> OfferPassiveReadiness {
self.passive_plan(evidence).readiness()
}
}