use crate::ExportError;
use std::sync::PoisonError;
use std::time;
use thiserror::Error;
pub type TraceResult<T> = Result<T, TraceError>;
#[derive(Error, Debug)]
#[non_exhaustive]
pub enum TraceError {
#[error("Exporter {0} encountered the following error(s): {name}", name = .0.exporter_name())]
ExportFailed(Box<dyn ExportError>),
#[error("Exporting timed out after {} seconds", .0.as_secs())]
ExportTimedOut(time::Duration),
#[error("TracerProvider already shutdown")]
TracerProviderAlreadyShutdown,
#[error(transparent)]
Other(#[from] Box<dyn std::error::Error + Send + Sync + 'static>),
}
impl<T> From<T> for TraceError
where
T: ExportError,
{
fn from(err: T) -> Self {
TraceError::ExportFailed(Box::new(err))
}
}
impl From<String> for TraceError {
fn from(err_msg: String) -> Self {
TraceError::Other(err_msg.into())
}
}
impl From<&'static str> for TraceError {
fn from(err_msg: &'static str) -> Self {
TraceError::Other(Box::new(Custom(err_msg.into())))
}
}
impl<T> From<PoisonError<T>> for TraceError {
fn from(err: PoisonError<T>) -> Self {
TraceError::Other(err.to_string().into())
}
}
#[derive(Error, Debug)]
#[error("{0}")]
struct Custom(String);