#[derive(Debug, Clone)]
pub struct ContentMatch {
pub extract: String,
pub needle_start: usize, pub needle_end: usize, }
impl ContentMatch {
pub fn build(
hay: &[u8],
pos: usize, needle: &str,
desired_len: usize, ) -> Self {
if hay.is_empty() {
return Self {
extract: String::new(),
needle_start: 0,
needle_end: 0,
};
}
let mut extract_start = pos;
let mut extract_end = pos + needle.len(); loop {
if extract_start == 0 || extract_end - extract_start >= desired_len / 2 {
break;
}
let c = hay[extract_start - 1];
if c < 32 {
break;
}
extract_start -= 1;
}
while (hay[extract_start] == 32) && extract_start < pos {
extract_start += 1;
}
loop {
if extract_end == hay.len() || extract_end - extract_start >= desired_len {
break;
}
let c = hay[extract_end];
if c < 32 {
break;
}
extract_end += 1;
}
let extract = String::from_utf8_lossy(&hay[extract_start..extract_end]).to_string();
let needle_start = extract.find(needle).unwrap_or(0);
Self {
extract,
needle_start,
needle_end: needle_start + needle.len(),
}
}
}