tracelite 0.1.26

An alternative to the tracing crate which is specialized for OpenTelemetry traces
Documentation
use crate::{SpanId, TraceId};
use std::num::{NonZeroU128, NonZeroU64};
use std::sync::atomic;

pub trait IdGenerator: Send + Sync + 'static {
    fn new_trace_id(&self) -> TraceId;
    fn new_span_id(&self) -> SpanId;
}

pub struct FastrandIdGenerator;

impl IdGenerator for FastrandIdGenerator {
    fn new_trace_id(&self) -> TraceId {
        TraceId(NonZeroU128::new(fastrand::u128(1..)).unwrap())
    }

    fn new_span_id(&self) -> SpanId {
        SpanId(NonZeroU64::new(fastrand::u64(1..)).unwrap())
    }
}

#[derive(Default)]
pub struct TestIdGenerator {
    next_trace_id: atomic::AtomicU32,
    next_span_id: atomic::AtomicU32,
}

impl IdGenerator for TestIdGenerator {
    fn new_trace_id(&self) -> TraceId {
        let u = self.next_trace_id.fetch_add(1, atomic::Ordering::SeqCst);
        TraceId(NonZeroU128::new(u as u128 + 1).unwrap())
    }

    fn new_span_id(&self) -> SpanId {
        let u = self.next_span_id.fetch_add(1, atomic::Ordering::SeqCst);
        SpanId(NonZeroU64::new(u as u64 + 1).unwrap())
    }
}