buttplug 0.2.0

Buttplug Intimate Hardware Control Library
Documentation
use crate::core::messages::{self, ButtplugOutMessage};
use async_std::{sync::Sender, task};
use log::{Level, Log, Metadata, Record};

pub struct ButtplugLogHandler {
    level: Level,
    message_sender: Sender<ButtplugOutMessage>,
}

impl ButtplugLogHandler {
    pub fn new(level: &messages::LogLevel, message_sender: Sender<ButtplugOutMessage>) -> Self {
        Self {
            level: level.clone().into(),
            message_sender,
        }
    }
}

impl Log for ButtplugLogHandler {
    fn enabled(&self, metadata: &Metadata) -> bool {
        metadata.level() <= self.level
    }

    fn log(&self, record: &Record) {
        if self.enabled(record.metadata()) {
            let target = if record.target().len() > 0 {
                record.target()
            } else {
                record.module_path().unwrap_or_default()
            };

            let sender_clone = self.message_sender.clone();
            let level: messages::LogLevel = record.level().into();
            let log_msg = format!("[{}] {}", target, record.args());
            task::spawn(async move {
                sender_clone
                    .send(messages::Log::new(level, log_msg).into())
                    .await;
            });
        }
    }

    fn flush(&self) {}
}