use tracing::Span;
pub(crate) enum ViewSpan {
Pending,
Open(Span),
Closed,
}
impl ViewSpan {
pub(crate) const fn new() -> Self {
Self::Pending
}
pub(crate) fn get(&self) -> Span {
match self {
Self::Open(span) => span.clone(),
Self::Pending | Self::Closed => Span::none(),
}
}
pub(crate) fn open(&mut self, make: impl FnOnce() -> Span) {
assert!(!matches!(self, Self::Closed), "reopened a closed view span");
if matches!(self, Self::Pending) {
*self = Self::Open(make());
}
}
pub(crate) fn adopt(&mut self, span: Span) {
assert!(
!matches!(self, Self::Closed),
"adopted onto a closed view span"
);
if matches!(self, Self::Pending) {
*self = Self::Open(span);
}
}
pub(crate) fn close(&mut self) {
*self = Self::Closed;
}
}