1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#![forbid(unsafe_code)]

use std::io;

pub trait Peek {
    fn peek_sync(&mut self, buf: &mut [u8]) -> io::Result<usize>;
}

mod tcp_stream {
    use super::*;

    use std::net::TcpStream;

    impl Peek for TcpStream {
        fn peek_sync(&mut self, buf: &mut [u8]) -> io::Result<usize> {
            self.peek(buf)
        }
    }
}

mod cursor {
    use super::*;

    use std::io::Cursor;
    use std::io::{BufRead, Read};

    impl<T> Peek for Cursor<T>
    where
        T: AsRef<[u8]>,
    {
        fn peek_sync(&mut self, buf: &mut [u8]) -> io::Result<usize> {
            let n = Read::read(&mut self.fill_buf()?, buf)?;
            Ok(n)
        }
    }
}