type SpanName = flexstr::SharedStr;
#[doc(hidden)]
pub fn fmt_span(args: std::fmt::Arguments<'_>) -> Span {
let name = if let Some(str) = args.as_str() {
SpanName::from_ref(str)
} else {
flexstr::flex_fmt(args)
};
Span::new(name)
}
#[macro_export]
macro_rules! span {
($($fmt_arg:tt)*) => {{
let res = $crate::__private::fmt_span(format_args!($($fmt_arg)*));
res
}};
}
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
#[derive(Debug, Clone, Default, PartialEq, Eq, PartialOrd, Ord)]
pub struct Span {
pub(crate) name: SpanName,
pub(crate) is_verbose: bool,
pub(crate) is_long_running: bool,
}
impl Span {
fn new(name: SpanName) -> Self {
Self {
name,
is_verbose: false,
is_long_running: false,
}
}
}
impl Span {
pub fn verbose(mut self) -> Self {
self.is_verbose = true;
self
}
pub fn long_running(mut self) -> Self {
self.is_long_running = true;
self
}
}
#[easy_ext::ext(SpanExt)]
impl<T: Into<Span>> T {
pub fn verbose(self) -> Span {
self.into().verbose()
}
pub fn long_running(self) -> Span {
self.into().long_running()
}
}
impl<S: AsRef<str>> From<S> for Span {
fn from(value: S) -> Self {
Self::new(SpanName::from_ref(value))
}
}
impl std::fmt::Display for Span {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.name.fmt(f)
}
}