Return plain Result from init_tracing instead of miette::Result
Add telemetry::Error (FromEnvError) with thiserror + Diagnostic derives. Callers no longer need into_diagnostic() since the error type implements Diagnostic directly.
change tsmuklwvwuvmpuyynzmunqzzrlpmvtzt
commit 6a214fbd3edb23a5d848830fbb4cb7e14a0ccabc
author Alpha Chen <alpha@kejadlen.dev>
date
parent zpmxnkxm
diff --git a/quire-core/src/telemetry.rs b/quire-core/src/telemetry.rs
index 8ebcc08..bec791f 100644
--- a/quire-core/src/telemetry.rs
+++ b/quire-core/src/telemetry.rs
@@ -1,11 +1,18 @@
 use std::cell::RefCell;
-use std::error::Error;
 use std::io::IsTerminal;
+use std::result::Result;
 use std::sync::Arc;
 
-use miette::IntoDiagnostic;
 use opentelemetry::trace::TracerProvider as _;
 use tracing_subscriber::EnvFilter;
+
+/// Errors that can occur during tracing initialization.
+#[derive(Debug, thiserror::Error, miette::Diagnostic)]
+pub enum Error {
+    #[error("invalid log filter: {0}")]
+    Filter(#[from] tracing_subscriber::filter::FromEnvError),
+}
+
 use tracing_subscriber::Layer;
 use tracing_subscriber::layer::SubscriberExt;
 use tracing_subscriber::util::SubscriberInitExt;
@@ -14,7 +21,7 @@ thread_local! {
     static MIETTE_RENDER: RefCell<Option<String>> = const { RefCell::new(None) };
 }
 
-type RenderFn = Box<dyn (Fn(&(dyn Error + 'static)) -> Option<String>) + Send + Sync>;
+type RenderFn = Box<dyn (Fn(&(dyn std::error::Error + 'static)) -> Option<String>) + Send + Sync>;
 
 /// A [`tracing_subscriber::Layer`] that intercepts `record_error` calls,
 /// renders the error as a naratable miette diagnostic, and stashes the
@@ -82,8 +89,8 @@ impl MietteLayer {
     {
         Arc::get_mut(&mut self.renderers)
             .expect("no other Arc refs at construction time")
-            .push(Box::new(|err: &(dyn Error + 'static)| {
-                let mut cur: Option<&(dyn Error + 'static)> = Some(err);
+            .push(Box::new(|err: &(dyn std::error::Error + 'static)| {
+                let mut cur: Option<&(dyn std::error::Error + 'static)> = Some(err);
                 while let Some(e) = cur {
                     if let Some(diag) = e.downcast_ref::<T>() {
                         let mut buf = String::new();
@@ -102,7 +109,7 @@ impl MietteLayer {
         self
     }
 
-    fn try_render(&self, err: &(dyn Error + 'static)) -> Option<String> {
+    fn try_render(&self, err: &(dyn std::error::Error + 'static)) -> Option<String> {
         self.renderers.iter().find_map(|r| r(err))
     }
 }
@@ -112,7 +119,11 @@ struct ErrorVisitor<'a> {
 }
 
 impl tracing::field::Visit for ErrorVisitor<'_> {
-    fn record_error(&mut self, _field: &tracing::field::Field, value: &(dyn Error + 'static)) {
+    fn record_error(
+        &mut self,
+        _field: &tracing::field::Field,
+        value: &(dyn std::error::Error + 'static),
+    ) {
         if let Some(rendered) = self.layer.try_render(value) {
             MIETTE_RENDER.with(|cell| *cell.borrow_mut() = Some(rendered));
         }
@@ -206,11 +217,8 @@ impl Drop for TracingGuard {
 /// Layer ordering is baked in: `miette_layer` registers before
 /// `sentry_tracing::layer()` so its thread-local is populated when
 /// sentry-tracing's `on_event` calls `capture_event`.
-pub fn init_tracing(miette_layer: MietteLayer, fmt_mode: FmtMode) -> miette::Result<TracingGuard> {
-    let filter = EnvFilter::builder()
-        .with_env_var("QUIRE_LOG")
-        .from_env()
-        .into_diagnostic()?;
+pub fn init_tracing(miette_layer: MietteLayer, fmt_mode: FmtMode) -> Result<TracingGuard, Error> {
+    let filter = EnvFilter::builder().with_env_var("QUIRE_LOG").from_env()?;
 
     let layer = tracing_subscriber::fmt::layer().with_writer(std::io::stderr);
     let fmt_layer = match fmt_mode {