use opentelemetry::global::BoxedTracer;
use std::fmt::Debug;
use std::sync::OnceLock;
#[derive(Debug)]
pub struct TracerSource<'a> {
variant: Variant<'a>,
tracer: OnceLock<BoxedTracer>,
}
enum Variant<'a> {
Borrowed(&'a BoxedTracer),
Lazy(&'a dyn Fn() -> BoxedTracer),
}
impl<'a> TracerSource<'a> {
pub fn borrowed(tracer: &'a BoxedTracer) -> Self {
Self {
variant: Variant::Borrowed(tracer),
tracer: OnceLock::new(),
}
}
pub fn lazy(factory: &'a dyn Fn() -> BoxedTracer) -> Self {
Self {
variant: Variant::Lazy(factory),
tracer: OnceLock::new(),
}
}
pub fn get(&self) -> &BoxedTracer {
use Variant::*;
match self.variant {
Borrowed(tracer) => tracer,
Lazy(factory) => self.tracer.get_or_init(factory),
}
}
}
impl Debug for Variant<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use Variant::*;
match self {
Borrowed(arg0) => f.debug_tuple("Borrowed").field(arg0).finish(),
Lazy(_arg0) => f.debug_tuple("Lazy").finish(),
}
}
}