use std::fmt::Display;
pub struct SpanResultRef<'a, T>(pub &'a T);
pub trait RecordSpanResult {
fn record(&self);
}
impl<T, E: Display> RecordSpanResult for &&SpanResultRef<'_, Result<T, E>> {
fn record(&self) {
use opentelemetry::trace::{Status, TraceContextExt as _};
match self.0 {
Ok(_) => {
opentelemetry::Context::current()
.span()
.set_status(Status::Ok);
}
Err(e) => {
opentelemetry::Context::current()
.span()
.set_status(Status::error(e.to_string()));
}
}
}
}
impl<T> RecordSpanResult for &SpanResultRef<'_, T> {
fn record(&self) {}
}
#[doc(hidden)]
#[macro_export]
macro_rules! span_result {
($expr:expr) => {{
use $crate::__private::RecordSpanResult as _;
(&&&$crate::__private::SpanResultRef(&$expr)).record();
}};
}