Skip to main content

std/io/
cursor.rs

1#[cfg(test)]
2mod tests;
3
4#[stable(feature = "rust1", since = "1.0.0")]
5pub use core::io::Cursor;
6
7use crate::io::prelude::*;
8use crate::io::{self, BorrowedCursor, IoSliceMut};
9
10#[stable(feature = "rust1", since = "1.0.0")]
11impl<T> Read for Cursor<T>
12where
13    T: AsRef<[u8]>,
14{
15    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
16        let n = Read::read(&mut Cursor::split(self).1, buf)?;
17        self.set_position(self.position() + n as u64);
18        Ok(n)
19    }
20
21    fn read_buf(&mut self, mut cursor: BorrowedCursor<'_, u8>) -> io::Result<()> {
22        let prev_written = cursor.written();
23
24        Read::read_buf(&mut Cursor::split(self).1, cursor.reborrow())?;
25
26        self.set_position(self.position() + (cursor.written() - prev_written) as u64);
27
28        Ok(())
29    }
30
31    fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
32        let mut nread = 0;
33        for buf in bufs {
34            let n = self.read(buf)?;
35            nread += n;
36            if n < buf.len() {
37                break;
38            }
39        }
40        Ok(nread)
41    }
42
43    fn is_read_vectored(&self) -> bool {
44        true
45    }
46
47    fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
48        let result = Read::read_exact(&mut Cursor::split(self).1, buf);
49
50        match result {
51            Ok(_) => self.set_position(self.position() + buf.len() as u64),
52            // The only possible error condition is EOF, so place the cursor at "EOF"
53            Err(_) => self.set_position(self.get_ref().as_ref().len() as u64),
54        }
55
56        result
57    }
58
59    fn read_buf_exact(&mut self, mut cursor: BorrowedCursor<'_, u8>) -> io::Result<()> {
60        let prev_written = cursor.written();
61
62        let result = Read::read_buf_exact(&mut Cursor::split(self).1, cursor.reborrow());
63        self.set_position(self.position() + (cursor.written() - prev_written) as u64);
64
65        result
66    }
67
68    fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
69        let content = Cursor::split(self).1;
70        let len = content.len();
71        buf.try_reserve(len)?;
72        buf.extend_from_slice(content);
73        self.set_position(self.position() + len as u64);
74
75        Ok(len)
76    }
77
78    fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
79        let content =
80            crate::str::from_utf8(Cursor::split(self).1).map_err(|_| io::Error::INVALID_UTF8)?;
81        let len = content.len();
82        buf.try_reserve(len)?;
83        buf.push_str(content);
84        self.set_position(self.position() + len as u64);
85
86        Ok(len)
87    }
88}
89
90#[stable(feature = "rust1", since = "1.0.0")]
91impl<T> BufRead for Cursor<T>
92where
93    T: AsRef<[u8]>,
94{
95    fn fill_buf(&mut self) -> io::Result<&[u8]> {
96        Ok(Cursor::split(self).1)
97    }
98    fn consume(&mut self, amt: usize) {
99        self.set_position(self.position() + amt as u64);
100    }
101}