use crate::parsing::ExtractedToken;
#[derive(Debug, Copy, Clone)]
pub struct FullText<'t> {
text: &'t str,
}
impl<'t> FullText<'t> {
#[inline]
pub fn new(text: &'t str) -> Self {
FullText { text }
}
#[inline]
#[doc(hidden)]
pub(crate) fn inner(&self) -> &'t str {
self.text
}
pub fn slice(
&self,
log: &slog::Logger,
start_token: &ExtractedToken,
end_token: &ExtractedToken,
) -> &'t str {
let start = start_token.span.start;
let end = end_token.span.end;
self.slice_impl(log, "full", start, end)
}
pub fn slice_partial(
&self,
log: &slog::Logger,
start_token: &ExtractedToken,
end_token: &ExtractedToken,
) -> &'t str {
let start = start_token.span.start;
let end = end_token.span.start;
self.slice_impl(log, "partial", start, end)
}
fn slice_impl(
&self,
log: &slog::Logger,
slice_kind: &'static str,
start: usize,
end: usize,
) -> &'t str {
info!(
log,
"Extracting {} slice from full text",
slice_kind;
"start" => start,
"end" => end,
);
if start > end {
panic!(
"Starting index is later than the ending index: {} > {}",
start, end,
);
}
&self.text[start..end]
}
}