}
}
+impl StreamLayout<CharReader<InputFileStream>> {
+ #[inline]
+ fn position(&mut self) -> Option<u64> {
+ // stream is the internal CharReader. subtract
+ // its pending buffer length from position.
+ self.get_mut().file.seek(SeekFrom::Current(0))
+ .map(|pos| pos - self.stream.rem_buf_len() as u64)
+ .ok()
+ }
+}
+
#[derive(Debug)]
pub struct OutputFileStream {
file_name: Atom,
pub(crate) fn position(&mut self) -> Option<(u64, usize)> {
// returns lines_read, position.
let result = match self {
- Stream::InputFile(ref mut file_stream) => {
- file_stream.get_mut().file.seek(SeekFrom::Current(0)).ok()
+ Stream::InputFile(file_stream) => {
+ file_stream.position()
}
Stream::NamedTcp(..)
| Stream::NamedTls(..)
} = &mut **stream_layout;
stream.get_mut().file.seek(SeekFrom::Start(position)).unwrap();
+ stream.reset_buffer(); // flush the internal buffer.
if let Ok(metadata) = stream.get_ref().file.metadata() {
*past_end_of_stream = position > metadata.len();
Stream::Byte(stream) => stream.past_end_of_stream,
Stream::InputFile(stream) => stream.past_end_of_stream,
Stream::OutputFile(stream) => stream.past_end_of_stream,
- // Stream::PausedProlog(stream) => stream.paused_stream.past_end_of_stream(),
Stream::StaticString(stream) => stream.past_end_of_stream,
Stream::NamedTcp(stream) => stream.past_end_of_stream,
Stream::NamedTls(stream) => stream.past_end_of_stream,
}
if let Stream::InputFile(stream_layout) = self {
+ let position = stream_layout.position();
+
let StreamLayout {
past_end_of_stream,
stream,
match stream.get_ref().file.metadata() {
Ok(metadata) => {
- if let Ok(position) = stream.get_mut().file.seek(SeekFrom::Current(0)) {
+ if let Some(position) = position {
return match position.cmp(&metadata.len()) {
Ordering::Equal => AtEndOfStream::At,
Ordering::Less => AtEndOfStream::Not,
http_stream.set_tag(ArenaHeaderTag::Dropped);
std::ptr::drop_in_place(&mut http_stream.inner_mut().body_reader as *mut _);
}
-
+
Ok(())
}
Stream::InputFile(mut file_stream) => {
pub fn inner_mut(&mut self) -> &mut R {
&mut self.inner
}
+
+ // Return the number of bytes remaining to be read. Useful for,
+ // e.g., determining the position relative to the end of the
+ // owning stream.
+ #[inline]
+ pub fn rem_buf_len(&self) -> usize {
+ self.buf.len() - self.pos
+ }
}
pub trait CharRead {
self.inner
}
- fn reset_buffer(&mut self) {
+ pub fn reset_buffer(&mut self) {
self.buf.clear();
self.pos = 0;
}