elf_lojban/src/strange.rs

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()]
}
}