use jacquard_core::{
DeliveryCompatibility, DeliveryCompatibilityPolicy, RouteAdmissionRejection,
RouteDeliveryObjective, TransportDeliveryIntent, TransportDeliverySupport,
};
#[must_use = "delivery admission must be checked before host send intent is used"]
pub fn admitted_delivery_intent(
objective: &RouteDeliveryObjective,
support: &TransportDeliverySupport,
policy: DeliveryCompatibilityPolicy,
) -> Result<TransportDeliveryIntent, RouteAdmissionRejection> {
match objective.compatible_with(support, policy) {
DeliveryCompatibility::Compatible => Ok(intent_for_support(support)),
DeliveryCompatibility::Rejected(reason) => Err(reason),
}
}
fn intent_for_support(support: &TransportDeliverySupport) -> TransportDeliveryIntent {
match support {
TransportDeliverySupport::IsolatedUnicast { endpoint, .. } => {
TransportDeliveryIntent::Unicast {
endpoint: endpoint.clone(),
}
}
TransportDeliverySupport::Multicast {
endpoint,
group_id,
receivers,
} => TransportDeliveryIntent::Multicast {
endpoint: endpoint.clone(),
group_id: *group_id,
receivers: receivers.clone(),
},
TransportDeliverySupport::Broadcast {
endpoint,
domain_id,
..
} => TransportDeliveryIntent::Broadcast {
endpoint: endpoint.clone(),
domain_id: *domain_id,
},
}
}