use serde::{Deserialize, Serialize};
#[cfg(feature = "cloudevents")]
use crate::error::EventError;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum TraceInfo {
WithState {
traceparent: String,
tracestate: String,
},
Traceparent {
traceparent: String,
},
}
impl TraceInfo {
#[must_use]
pub fn traceparent(&self) -> &str {
match self {
Self::Traceparent { traceparent } | Self::WithState { traceparent, .. } => traceparent,
}
}
#[must_use]
pub fn tracestate(&self) -> Option<&str> {
match self {
Self::Traceparent { .. } => None,
Self::WithState { tracestate, .. } => Some(tracestate),
}
}
#[cfg(feature = "cloudevents")]
pub fn from_cloudevent(event: &cloudevents::Event) -> Result<Option<Self>, EventError> {
let traceparent = event.extension("traceparent").map(ToString::to_string);
let tracestate = event.extension("tracestate").map(ToString::to_string);
match (traceparent, tracestate) {
(Some(traceparent), Some(tracestate)) => Ok(Some(Self::WithState {
traceparent,
tracestate,
})),
(Some(traceparent), None) => Ok(Some(Self::Traceparent { traceparent })),
(None, None) => Ok(None),
(None, Some(_)) => Err(EventError::InvalidCloudevent),
}
}
}