use crate::s;
use unwrap::unwrap;
pub fn get_delimited_text(source_str: &str, pos_cursor: usize, start_delimiter: &str, end_delimiter: &str) -> Option<(String, usize)> {
if let Some(pos_start) = find_pos_after_delimiter(source_str, pos_cursor, start_delimiter) {
if let Some(pos_end) = find_pos_before_delimiter(source_str, pos_start, end_delimiter) {
let new_text = s!(unwrap!(source_str.get(pos_start..pos_end)));
let new_pos_cursor = pos_end + end_delimiter.len();
return Some((new_text, new_pos_cursor));
}
}
None
}
pub fn find_range_including_delimiters(source_str: &str, pos_cursor: &mut usize, start_delimiter: &str, end_delimiter: &str) -> Option<std::ops::Range<usize>> {
if let Some(pos_start) = find_pos_before_delimiter(source_str, *pos_cursor, start_delimiter) {
if let Some(pos_end) = find_pos_after_delimiter(source_str, pos_start, end_delimiter) {
*pos_cursor = pos_end;
return Some(pos_start..pos_end);
}
}
None
}
pub fn find_range_between_delimiters(source_str: &str, pos_cursor: &mut usize, start_delimiter: &str, end_delimiter: &str) -> Option<std::ops::Range<usize>> {
if let Some(pos_start) = find_pos_after_delimiter(source_str, *pos_cursor, start_delimiter) {
if let Some(pos_end) = find_pos_before_delimiter(source_str, pos_start, end_delimiter) {
*pos_cursor = pos_end + end_delimiter.len();
return Some(pos_start..pos_end);
}
}
None
}
pub fn find_pos_after_delimiter(source_str: &str, pos_cursor: usize, delimiter: &str) -> Option<usize> {
if let Some(pos) = find_from(source_str, pos_cursor, delimiter) {
let pos = pos + delimiter.len();
return Some(pos);
}
None
}
pub fn find_pos_before_delimiter(source_str: &str, pos_cursor: usize, delimiter: &str) -> Option<usize> {
if let Some(pos) = find_from(source_str, pos_cursor, delimiter) {
return Some(pos);
}
None
}
pub fn find_from(source_str: &str, pos_cursor: usize, find_str: &str) -> Option<usize> {
let slice01 = unwrap!(source_str.get(pos_cursor..));
let option_pos_found = slice01.find(find_str);
if let Some(pos_found) = option_pos_found {
Some(pos_cursor + pos_found)
} else {
None
}
}
pub fn get_text_without_delimited_fragment(source_str: &str, pos_cursor: usize, start_delimiter: &str, end_delimiter: &str) -> String {
if let Some(pos_start) = find_pos_before_delimiter(source_str, pos_cursor, start_delimiter) {
if let Some(pos_end) = find_pos_after_delimiter(source_str, pos_start, end_delimiter) {
let mut new_text = s!(source_str[..pos_start]);
new_text.push_str(&source_str[pos_end..]);
return new_text;
}
}
s!(source_str)
}