use crate::sampling_flags;
use crate::{SamplingFlags, SpanId, TraceId};
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct TraceContext {
trace_id: TraceId,
parent_id: Option<SpanId>,
span_id: SpanId,
flags: SamplingFlags,
}
impl TraceContext {
#[inline]
pub fn builder() -> Builder {
Builder {
trace_id: None,
parent_id: None,
span_id: None,
flags: SamplingFlags::builder(),
}
}
#[inline]
pub fn trace_id(&self) -> TraceId {
self.trace_id
}
#[inline]
pub fn parent_id(&self) -> Option<SpanId> {
self.parent_id
}
#[inline]
pub fn span_id(&self) -> SpanId {
self.span_id
}
#[inline]
pub fn sampling_flags(&self) -> SamplingFlags {
self.flags
}
#[inline]
pub fn sampled(&self) -> Option<bool> {
self.flags.sampled()
}
#[inline]
pub fn debug(&self) -> bool {
self.flags.debug()
}
}
pub struct Builder {
trace_id: Option<TraceId>,
parent_id: Option<SpanId>,
span_id: Option<SpanId>,
flags: sampling_flags::Builder,
}
impl From<TraceContext> for Builder {
#[inline]
fn from(c: TraceContext) -> Builder {
Builder {
trace_id: Some(c.trace_id),
parent_id: c.parent_id,
span_id: Some(c.span_id),
flags: c.flags.into(),
}
}
}
impl Builder {
#[inline]
pub fn trace_id(&mut self, trace_id: TraceId) -> &mut Builder {
self.trace_id = Some(trace_id);
self
}
#[inline]
pub fn parent_id(&mut self, parent_id: SpanId) -> &mut Builder {
self.parent_id = Some(parent_id);
self
}
#[inline]
pub fn span_id(&mut self, span_id: SpanId) -> &mut Builder {
self.span_id = Some(span_id);
self
}
#[inline]
pub fn sampling_flags(&mut self, flags: SamplingFlags) -> &mut Builder {
self.flags = flags.into();
self
}
#[inline]
pub fn sampled(&mut self, sampled: bool) -> &mut Builder {
self.flags.sampled(sampled);
self
}
#[inline]
pub fn debug(&mut self, debug: bool) -> &mut Builder {
self.flags.debug(debug);
self
}
#[inline]
pub fn build(&self) -> TraceContext {
TraceContext {
trace_id: self.trace_id.expect("trace ID not set"),
parent_id: self.parent_id,
span_id: self.span_id.expect("span ID not set"),
flags: self.flags.build(),
}
}
}