use std::ops::Range; #[derive(Debug, Clone, Eq, PartialEq)] pub struct StrRange<'src_buf> { src: &'src_buf str, range: Range, } impl<'src_buf> StrRange<'src_buf> { pub fn new(src: &'src_buf str, start: usize, length: usize) -> Self { Self { src, range: start..(start + length), } } pub fn src(&self) -> &'src_buf str { self.src } pub fn increase_length(&mut self, add_len: usize) { self.range = self.range.start..self.range.end + add_len; } 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) -> 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()] } }