flarelog 0.5.0

flarelog is an ergonomic logging library for Rust with a focus on simplicity and speed.
Documentation
use crossbeam_channel;
use std::thread;
use std::marker::Send;
use std::fmt::Debug;
use crate::logentry::LogEntry;
use crate::flare::{LogEntrySender, LogEntryReceiver, SerializedSender};
use crate::time;

pub struct FlareWorkerPool<T>
where T: LogEntry + Send + Clone + Debug {
    pub workers: Vec<FlareWorker<T>>,
    pub sender: LogEntrySender<T>,
}

impl<T: 'static> FlareWorkerPool<T>
where T: LogEntry + Send + Clone + Debug {
    pub fn new(iosender: SerializedSender, worker_amount: usize) -> Self {
        let (s, r): (LogEntrySender<T>, LogEntryReceiver<T>) = crossbeam_channel::unbounded();

        let workers: Vec<_> = (0..worker_amount).map(|_| {
            FlareWorker::new(iosender.clone(), r.clone())
        }).collect();

        Self {
            workers,
            sender: s,
        }
    }
}

pub struct FlareWorker<T>
where T: LogEntry + Send + Clone + Debug {
    pub thread_handle: thread::JoinHandle<()>,
    pub receiver: LogEntryReceiver<T>,
}

impl<T: 'static> FlareWorker<T>
where T: LogEntry + Send + Clone + Debug {
    pub fn new(iosender: SerializedSender, receiver: LogEntryReceiver<T>) -> Self {
        let interface = FlareWorkerInterface::new(receiver.clone(), iosender);

        let handle = thread::spawn(move || {
            loop {
                let entry = interface.receiver.recv().unwrap();
                let strentry = format!("{} | {}", time::local_str(), entry.stringify());
                interface.iosender.send(strentry).unwrap();
            }
        });

        Self {
            thread_handle: handle,
            receiver,
        }
    }
}

#[derive(Clone)]
pub struct FlareWorkerInterface<T>
where T: LogEntry + Send + Clone + Debug  {
    pub receiver: crossbeam_channel::Receiver<T>,
    pub iosender: crossbeam_channel::Sender<String>,
}

impl<T> FlareWorkerInterface<T>
where T: LogEntry + Send + Clone + Debug  {
    fn new(receiver: crossbeam_channel::Receiver<T>, iosender: crossbeam_channel::Sender<String>) -> Self {
        Self {
            receiver,
            iosender,
        }
    }
}