sitrep 0.4.0

Frontend-agnostic progress reporting
Documentation
use std::sync::mpsc::Sender;

use crate::{Event, Observer};

/// Implementation of `Observer` based on `std::sync::mpsc::Sender`.
#[derive(Clone, Debug)]
pub struct StdMpscObserver {
    /// The sending-half of std's channel type.
    pub sender: Sender<Event>,
}

impl From<Sender<Event>> for StdMpscObserver {
    fn from(sender: Sender<Event>) -> Self {
        Self { sender }
    }
}

impl From<StdMpscObserver> for Sender<Event> {
    fn from(observer: StdMpscObserver) -> Self {
        observer.sender
    }
}

impl Observer for StdMpscObserver {
    fn observe(&self, event: Event) {
        #[cfg(feature = "tracing")]
        if let Err(err) = self.sender.send(event) {
            tracing::debug!(
                error = ?err,
                "Failed to send event: receiver has been dropped. This is expected during shutdown."
            );
        }

        #[cfg(not(feature = "tracing"))]
        let _ = self.sender.send(event);
    }
}

/// Implementation of `Observer` that does nothing.
#[derive(Clone, Debug)]
pub struct NopObserver;

impl Observer for NopObserver {
    fn observe(&self, event: Event) {
        let _ = event;
    }
}