apollo-opentelemetry 0.8.0

OpenTelemetry configuration types for Apollo platform
Documentation
//! Autoref specialization types for setting span status based on result type.

use std::fmt::Display;

/// Wrapper for autoref specialization in `span_result!` macro.
pub struct SpanResultRef<'a, T>(pub &'a T);

/// Trait for recording span status based on result type.
/// Uses autoref specialization: `&&SpanResultRef<Result<T, E>>` takes priority over `&SpanResultRef<T>`.
pub trait RecordSpanResult {
    fn record(&self);
}

// High priority: Result types set span status
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()));
            }
        }
    }
}

// Fallback: non-Result types are a no-op
impl<T> RecordSpanResult for &SpanResultRef<'_, T> {
    fn record(&self) {}
}

/// Internal macro for setting span status. Not part of the public API.
#[doc(hidden)]
#[macro_export]
macro_rules! span_result {
    ($expr:expr) => {{
        use $crate::__private::RecordSpanResult as _;
        (&&&$crate::__private::SpanResultRef(&$expr)).record();
    }};
}