65 lines
1.5 KiB
Rust
65 lines
1.5 KiB
Rust
use std::ops::Range;
|
|
|
|
#[derive(Debug, Clone, Eq, PartialEq)]
|
|
pub struct StrRange<'src_buf> {
|
|
src: &'src_buf str,
|
|
range: Range<usize>,
|
|
}
|
|
|
|
impl<'src_buf> StrRange<'src_buf> {
|
|
pub fn new(src: &'src_buf str, start: usize, length: usize) -> Self {
|
|
let range = start..(start + length);
|
|
if src.get(range.clone()).is_none() {
|
|
//
|
|
if src[range.clone()].is_empty() {
|
|
panic!["This should not happen"];
|
|
}
|
|
}
|
|
Self { src, range }
|
|
}
|
|
|
|
pub fn src(&self) -> &'src_buf str {
|
|
self.src
|
|
}
|
|
|
|
pub fn increase_length(&mut self, add_len: usize) {
|
|
let range = self.range.start..(self.range.end + add_len);
|
|
if self.src.get(range.clone()).is_none() {
|
|
//
|
|
if self.src[range.clone()].is_empty() {
|
|
panic!["This should not happen"];
|
|
}
|
|
}
|
|
self.range = range;
|
|
}
|
|
|
|
pub fn as_str(&self) -> &'src_buf str {
|
|
&self.src[self.range.clone()]
|
|
}
|
|
|
|
pub fn len(&self) -> usize {
|
|
self.range.len()
|
|
}
|
|
|
|
pub fn is_empty(&self) -> bool {
|
|
self.range.is_empty()
|
|
}
|
|
|
|
// pub fn offset_range(&self, range: Range<usize>) -> Self {
|
|
// Self {
|
|
// range: (self.range.start + range.start)..(self.range.start + range.end),
|
|
// src: self.src,
|
|
// }
|
|
// }
|
|
|
|
pub fn start(&self) -> usize {
|
|
self.range.start
|
|
}
|
|
}
|
|
|
|
impl<'src_buf> core::fmt::Display for StrRange<'src_buf> {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> core::fmt::Result {
|
|
write![f, "{}", self.as_str()]
|
|
}
|
|
}
|