openssh_sftp_client_lowlevel/
buffer.rs

1#![forbid(unsafe_code)]
2
3use bytes::BytesMut;
4
5/// Any type that can act as a buffer.
6pub trait ToBuffer {
7    /// Returned the buffer.
8    fn get_buffer(&mut self) -> Buffer<'_>;
9}
10
11/// Buffer that can be used to write data into.
12#[derive(Debug)]
13pub enum Buffer<'a> {
14    /// A `Vec<u8>` acts as a buffer.
15    Vector(&'a mut Vec<u8>),
16
17    /// A byte slice acts as a buffer.
18    Slice(&'a mut [u8]),
19
20    /// A `BytesMut` acts as a buffer.
21    Bytes(&'a mut BytesMut),
22}
23
24impl ToBuffer for Vec<u8> {
25    #[inline(always)]
26    fn get_buffer(&mut self) -> Buffer<'_> {
27        Buffer::Vector(self)
28    }
29}
30
31impl ToBuffer for BytesMut {
32    #[inline(always)]
33    fn get_buffer(&mut self) -> Buffer<'_> {
34        Buffer::Bytes(self)
35    }
36}
37
38impl ToBuffer for Box<[u8]> {
39    #[inline(always)]
40    fn get_buffer(&mut self) -> Buffer<'_> {
41        Buffer::Slice(&mut *self)
42    }
43}
44
45impl<const LEN: usize> ToBuffer for [u8; LEN] {
46    #[inline(always)]
47    fn get_buffer(&mut self) -> Buffer<'_> {
48        Buffer::Slice(self)
49    }
50}