pub fn find_data_marker_byte_lexed(s: &str) -> Option<usize> {
use perl_lexer::{PerlLexer, TokenType};
let mut lx = PerlLexer::new(s);
while let Some(tok) = lx.next_token() {
match tok.token_type {
TokenType::DataMarker(_) => return Some(tok.start),
TokenType::EOF => break,
_ => {}
}
}
None
}
pub fn code_slice(text: &str) -> &str {
find_data_marker_byte_lexed(text).map(|i| &text[..i]).unwrap_or(text)
}
#[deprecated(note = "Use find_data_marker_byte_lexed to avoid false positives in heredocs/POD")]
pub fn find_data_marker_byte(s: &str) -> Option<usize> {
find_data_marker_byte_lexed(s)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_find_data_marker_lexed() {
assert_eq!(find_data_marker_byte_lexed("print 'hello';\n"), None);
let src = "print 'hello';\n__DATA__\ndata here";
assert_eq!(find_data_marker_byte_lexed(src), Some(15));
let src2 = "code;\n__END__\ndata";
assert_eq!(find_data_marker_byte_lexed(src2), Some(6));
let src3 = "print '__DATA__';\n";
assert_eq!(find_data_marker_byte_lexed(src3), None);
}
#[test]
fn test_code_slice() {
assert_eq!(code_slice("print 'hello';\n"), "print 'hello';\n");
let src = "print 'hello';\n__DATA__\ndata here";
assert_eq!(code_slice(src), "print 'hello';\n");
let src2 = "code;\n__END__\ndata";
assert_eq!(code_slice(src2), "code;\n");
}
}