use super::Spans;
use crate::token::{CaptureBuilder, SpanHandle, SpanResolutionRefusal};
use proc_macro::Span;
impl Spans {
#[must_use]
pub const fn empty() -> Self {
Self {
builder: CaptureBuilder::declared(),
}
}
pub(crate) const fn builder(&mut self) -> &mut CaptureBuilder<Span> {
&mut self.builder
}
#[must_use]
pub fn at(&self, handle: SpanHandle) -> Span {
self.resolve(handle).unwrap_or_else(|_| Span::call_site())
}
pub(crate) fn resolve(&self, handle: SpanHandle) -> Result<Span, SpanResolutionRefusal> {
usize::try_from(handle.index())
.ok()
.and_then(|index| self.builder.positions().get(index).copied())
.ok_or(SpanResolutionRefusal {
handle,
reaches: self.builder.positions().len(),
})
}
}