use super::Span;
pub(super) fn stage(rest: &str, start: usize) -> Span {
let mut quote = None;
let mut escaped = false;
let mut depth = 0_usize;
let mut end = rest.len();
for (offset, character) in rest.char_indices() {
if let Some(delimiter) = quote {
if escaped {
escaped = false;
} else if character == '\\' && delimiter == '"' {
escaped = true;
} else if character == delimiter {
quote = None;
}
continue;
}
match character {
'\'' | '"' => quote = Some(character),
'(' | '[' | '{' => depth += 1,
')' | ']' | '}' => depth = depth.saturating_sub(1),
'|' if depth == 0 => {
end = offset;
break;
}
_ => {}
}
}
Span {
start,
end: start + rest.split_at(end).0.trim_end().len(),
}
}