use super::{CapturedFragment, CapturedInput, CapturedTokenTree, SpanHandle};
impl CapturedInput {
#[must_use]
pub fn fragment(&self) -> CapturedFragment<'_> {
CapturedFragment::over(self.trees(), None)
}
}
impl CapturedTokenTree {
#[must_use]
pub fn group_fragment(
&self,
expected: super::CapturedDelimiter,
) -> Option<CapturedFragment<'_>> {
self.group().and_then(|(delimiter, members)| {
(delimiter == expected).then(|| CapturedFragment::over(members, Some(self.span())))
})
}
}
impl<'tokens> CapturedFragment<'tokens> {
#[must_use]
pub(super) const fn over(
tokens: &'tokens [CapturedTokenTree],
end: Option<SpanHandle>,
) -> Self {
Self { tokens, end }
}
#[must_use]
pub const fn tokens(self) -> &'tokens [CapturedTokenTree] {
self.tokens
}
#[must_use]
pub const fn len(self) -> usize {
self.tokens.len()
}
#[must_use]
pub const fn is_empty(self) -> bool {
self.tokens.is_empty()
}
#[must_use]
pub fn first_span(self) -> Option<SpanHandle> {
self.tokens.first().map(CapturedTokenTree::span)
}
#[must_use]
pub fn last_span(self) -> Option<SpanHandle> {
self.tokens.last().map(CapturedTokenTree::span)
}
#[must_use]
pub const fn enclosing_span(self) -> Option<SpanHandle> {
self.end
}
#[must_use]
pub fn canonical_bytes(self) -> Vec<u8> {
let mut bytes = Vec::new();
for token in self.tokens {
super::encode::encode_captured(token, &mut bytes);
}
bytes
}
}