kairoi 0.2.1

Another application-level tracing library
Documentation
use std::sync::Arc;
use crate::channel::tx;
use crate::{Span, SpanRef};
use crossbeam_channel::SendError;
use std::time::SystemTime;

#[derive(Debug, Copy, Clone)]
pub enum Level {
    Error,
    Warn,
    Info,
    Debug,
    Trace,
}

pub struct Log {
    timestamp: SystemTime,
    level: Level,
    message: String,
    span: SpanRef,
}

impl Log {
    fn new(level: Level, message: String) -> Self {
        Self {
            timestamp: SystemTime::now(),
            level,
            message,
            span: Span::current(),
        }
    }

    pub fn timestamp(&self) -> SystemTime {
        self.timestamp
    }

    pub fn level(&self) -> Level {
        self.level
    }

    pub fn message(&self) -> &str {
        &self.message
    }

    pub fn span(&self) -> &SpanRef {
        &self.span
    }
}

pub enum Event {
    Log(Arc<Log>),
    SpanBegin(SpanRef),
    SpanEnd(SpanRef),
}

impl Event {
    pub fn log(level: Level, message: String) -> Self {
        Event::Log(Arc::new(Log::new(level, message)))
    }

    pub fn span_begin(span: SpanRef) -> Self {
        Self::SpanBegin(span)
    }

    pub fn span_end(span: SpanRef) -> Self {
        Self::SpanEnd(span)
    }

    pub fn submit(self) {
        let mut i = 0;
        let mut v = self;
        while let Err(SendError(e)) = tx().send(v) {
            v = e;
            i += 1;
            if i == 5 {
                eprintln!("[kairoi] failed to submit event to event queue");
                break;
            }
        }
    }
}