use super::*;
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum COVNotificationDelivery {
Confirmed,
Unconfirmed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ConfirmedCOVNotificationResponse {
Ack,
Reject(RejectReason),
NoResponse,
}
pub type ConfirmedCOVNotificationAckPolicy =
Arc<dyn Fn(&ReceivedCOVNotification) -> ConfirmedCOVNotificationResponse + Send + Sync>;
#[derive(Debug, Clone, PartialEq)]
pub struct ReceivedCOVNotification {
pub notification: COVNotificationRequest,
pub source_mac: MacAddr,
pub source_network: Option<u16>,
pub source_address: Option<MacAddr>,
pub delivery: COVNotificationDelivery,
}
impl ReceivedCOVNotification {
pub(crate) fn new(
notification: COVNotificationRequest,
source_mac: &[u8],
source_network: &Option<NpduAddress>,
delivery: COVNotificationDelivery,
) -> Self {
let (network, address) = match source_network {
Some(npdu_addr) if !npdu_addr.mac_address.is_empty() => {
(Some(npdu_addr.network), Some(npdu_addr.mac_address.clone()))
}
_ => (None, None),
};
Self {
notification,
source_mac: MacAddr::from_slice(source_mac),
source_network: network,
source_address: address,
delivery,
}
}
}
pub(crate) fn default_confirmed_cov_notification_ack_policy() -> ConfirmedCOVNotificationAckPolicy {
Arc::new(|_| ConfirmedCOVNotificationResponse::Ack)
}
impl ClientOptions {
pub fn with_confirmed_cov_notification_ack_policy<F>(mut self, policy: F) -> Self
where
F: Fn(&ReceivedCOVNotification) -> ConfirmedCOVNotificationResponse + Send + Sync + 'static,
{
self.confirmed_cov_notification_ack_policy = Arc::new(policy);
self
}
}
impl fmt::Debug for ClientOptions {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("ClientOptions")
.field("cov_channel_capacity", &self.cov_channel_capacity)
.field("confirmed_cov_notification_ack_policy", &"<callback>")
.finish()
}
}