use super::fsm::StringKind;
pub(super) fn open(bytes: &[u8], pos: usize) -> Option<(usize, StringKind)> {
let rest = &bytes[pos..];
if rest[0] != b'r' {
return None;
}
let hashes = rest[1..].iter().take_while(|b| **b == b'#').count();
if rest.get(1 + hashes) != Some(&b'"') {
return None;
}
let before = match &bytes[..pos] {
[before @ .., b'b' | b'c'] => before,
before => before,
};
let in_a_name = |b: &u8| b.is_ascii_alphanumeric() || *b == b'_' || !b.is_ascii();
(!before.last().is_some_and(in_a_name)).then_some((hashes + 2, StringKind::Raw(hashes)))
}
pub(super) fn scan(rest: &[u8], hashes: usize) -> (usize, bool) {
let closing = rest[1..].iter().take_while(|b| **b == b'#').count();
let closed = rest[0] == b'"' && closing >= hashes;
(if closed { 1 + hashes } else { 1 }, closed)
}