pub fn frame_end(buf: &[u8]) -> Option<usize> {
let mut i = 0;
while i < buf.len() {
let Some(first) = newline_len(buf, i) else {
i += 1;
continue;
};
let after_first = i + first;
if let Some(second) = newline_len(buf, after_first) {
return Some(after_first + second);
}
i = after_first;
}
None
}
fn newline_len(buf: &[u8], idx: usize) -> Option<usize> {
match buf.get(idx) {
Some(b'\r') if buf.get(idx + 1) == Some(&b'\n') => Some(2),
Some(b'\n' | b'\r') => Some(1),
_ => None,
}
}