use super::{
ConnectionProcessState, ConnectionRuntime, FrameAction, HotAction, MembershipAction,
WorkerRegistration, lys_decision, lys_refusal, membership_refusal, worker_register_rejected,
};
use liminal::protocol::{Frame, WorkerRegisterOutcome};
pub(super) fn decide(
runtime: &ConnectionRuntime,
state: &ConnectionProcessState,
registration: &WorkerRegistration,
) -> Option<FrameAction> {
if let Some(reason) = lys_refusal(runtime, state, ®istration.task_queue, HotAction::Serve)
.or_else(|| membership_refusal(state, ®istration.task_queue, MembershipAction::Post))
{
return Some(worker_register_rejected(reason));
}
for namespace in ®istration.namespaces {
if let Some(refused) = lys_decision(runtime, state, namespace, HotAction::Serve, |reason| {
Frame::WorkerRegisterAck {
flags: 0,
outcome: WorkerRegisterOutcome::Rejected { reason },
}
}) {
return Some(refused);
}
}
None
}