winston 0.6.0

winston for rust
Documentation
use std::{fmt, sync::Arc};

use logform::{Format, LogInfo};
use winston_transport::{LogQuery, Transport};

#[derive(Clone)]
pub struct LoggerTransport<L> {
    transport: Arc<dyn Transport<L> + Send + Sync>,
    level: Option<String>,
    format: Option<Arc<dyn Format<Input = L> + Send + Sync>>,
}

impl<L> LoggerTransport<L> {
    pub fn new(transport: Arc<dyn Transport<L> + Send + Sync>) -> Self {
        Self {
            transport,
            level: None,
            format: None,
        }
    }

    pub fn with_level(mut self, level: String) -> Self {
        self.level = Some(level);
        self
    }

    pub fn with_format(mut self, format: Arc<dyn Format<Input = L> + Send + Sync>) -> Self {
        self.format = Some(format);
        self
    }

    pub fn get_level(&self) -> Option<&String> {
        self.level.as_ref()
    }
    pub fn get_format(&self) -> Option<Arc<dyn Format<Input = L> + Send + Sync>> {
        self.format.clone()
    }

    pub fn get_transport(&self) -> &Arc<dyn Transport<L> + Send + Sync> {
        &self.transport
    }
}

impl<L> Transport<L> for LoggerTransport<L> {
    fn log(&self, info: L) {
        self.transport.log(info)
    }
    fn flush(&self) -> Result<(), String> {
        self.transport.flush()
    }
    fn query(&self, options: &LogQuery) -> Result<Vec<L>, String> {
        self.transport.query(options)
    }
}

impl<L> fmt::Debug for LoggerTransport<L> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("LoggerTransport")
            .field(
                "transport",
                &format!("Transport<{}>", std::any::type_name::<L>()),
            )
            .field("level", &self.level)
            .field("format", &self.format.as_ref().map(|_| "Format<...>"))
            .finish()
    }
}

impl From<Arc<dyn Transport<LogInfo> + Send + Sync>> for LoggerTransport<LogInfo> {
    fn from(transport: Arc<dyn Transport<LogInfo> + Send + Sync>) -> Self {
        LoggerTransport::new(transport)
    }
}