in src/delimited.rs [75:120]
fn push(&mut self, val: impl Into<Bytes>) {
let val: Bytes = val.into();
let is_escape = &mut self.is_escape;
let is_quote = &mut self.is_quote;
let mut record_ends = val.iter().enumerate().filter_map(|(idx, v)| {
if *is_escape {
*is_escape = false;
None
} else if *v == ESCAPE {
*is_escape = true;
None
} else if *v == QUOTE {
*is_quote = !*is_quote;
None
} else if *is_quote {
None
} else {
(*v == NEWLINE).then_some(idx + 1)
}
});
let start_offset = match self.remainder.is_empty() {
true => 0,
false => match record_ends.next() {
Some(idx) => {
self.remainder.extend_from_slice(&val[0..idx]);
self.complete
.push_back(Bytes::from(std::mem::take(&mut self.remainder)));
idx
}
None => {
self.remainder.extend_from_slice(&val);
return;
}
},
};
let end_offset = record_ends.next_back().unwrap_or(start_offset);
if start_offset != end_offset {
self.complete.push_back(val.slice(start_offset..end_offset));
}
if end_offset != val.len() {
self.remainder.extend_from_slice(&val[end_offset..])
}
}