links_core 0.2.12

Core create of the links collection
Documentation
use std::{
    fmt::{Debug, Display},
    sync::Arc,
};

use crate::{asserted_short_name, prelude::*};

/// Implements [CallbackSend] and [CallbackRecv] but simply ignores all messages. Complier should optimize away this callback
#[derive(Debug, Clone)]
pub struct DevNullCallback<M: Messenger> {
    phantom: std::marker::PhantomData<M>,
}
impl<M: Messenger> Default for DevNullCallback<M> {
    fn default() -> Self {
        Self { phantom: std::marker::PhantomData }
    }
}
impl<M: Messenger> DevNullCallback<M> {
    pub fn new_ref() -> Arc<Self> {
        Self::default().into()
    }
}
impl<M: Messenger> Display for DevNullCallback<M> {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", asserted_short_name!("DevNullCallback", Self))
    }
}
impl<M: Messenger> CallbackRecvSend<M> for DevNullCallback<M> {}
impl<M: Messenger> CallbackRecv<M> for DevNullCallback<M> {
    #[inline(always)]
    fn on_recv(&self, _con_id: &ConId, _msg: &<M as Messenger>::RecvT) {}
}
impl<M: Messenger> CallbackSend<M> for DevNullCallback<M> {
    #[inline(always)]
    fn on_sent(&self, _con_id: &ConId, _msg: &<M as Messenger>::SendT) {}
}

#[cfg(test)]
#[cfg(feature = "unittest")]
mod test {

    use crate::prelude::*;
    use crate::unittest::setup::{self, messenger::CltTestMessenger, model::*};

    #[test]
    fn test_callback() {
        setup::log::configure_level(log::LevelFilter::Trace);
        let clbk = DevNullCallback::<CltTestMessenger>::new_ref();

        for _ in 0..2 {
            let msg = CltTestMsg::Dbg(CltTestMsgDebug::new(b"hello".as_slice()));
            clbk.on_sent(&ConId::default(), &msg);
        }
        for _ in 0..2 {
            let msg = SvcTestMsg::Dbg(SvcTestMsgDebug::new(b"hello".as_slice()));
            clbk.on_recv(&ConId::default(), &msg);
        }
    }
}