use crate::{
Buffer,
EdError,
Result,
};
pub (super) fn get_tag(
buffer: &Buffer,
tag: char,
) -> Result<usize> {
match buffer.iter().enumerate() .filter(|(_, line)| line.tag() == tag)
.next()
{
Some((i, _)) => Ok(i + 1), None => Err(EdError::TagNoMatch(tag)),
}
}
pub(super) enum Direction {
Forwards,
Backwards,
}
pub(super) fn get_matching(
buffer: &Buffer,
pattern: &str,
curr_line: usize,
direction: Direction,
) -> Result<usize> {
buffer.verify_line(curr_line)?;
use regex::RegexBuilder;
let regex = RegexBuilder::new(pattern)
.multi_line(true)
.build()
.map_err(|e|EdError::regex_error(e,pattern))
?;
let distance = match direction {
Direction::Forwards => buffer.len() - curr_line,
Direction::Backwards => curr_line - 1,
};
for index in 0 .. distance { match direction {
Direction::Forwards => {
if regex.is_match(&(buffer[curr_line + index].text)) {
return Ok(curr_line + 1 + index); }
},
Direction::Backwards => {
if regex.is_match(&(buffer[curr_line - 2 - index].text)) {
return Ok(curr_line - 1 - index); }
},
}}
Err(EdError::RegexNoMatch(pattern.to_owned()))
}