tokio_io_utility/
io_slice_ext.rs

1use std::{
2    io::{IoSlice, IoSliceMut},
3    slice::{from_raw_parts, from_raw_parts_mut},
4};
5
6pub trait IoSliceExt<'a> {
7    fn into_inner(self) -> &'a [u8];
8}
9
10impl<'a> IoSliceExt<'a> for IoSlice<'a> {
11    fn into_inner(self) -> &'a [u8] {
12        let slice = &*self;
13        unsafe { from_raw_parts(slice.as_ptr(), slice.len()) }
14    }
15}
16
17pub trait IoSliceMutExt<'a> {
18    fn into_inner(self) -> &'a mut [u8];
19}
20
21impl<'a> IoSliceMutExt<'a> for IoSliceMut<'a> {
22    fn into_inner(mut self) -> &'a mut [u8] {
23        let slice = &mut *self;
24        unsafe { from_raw_parts_mut(slice.as_mut_ptr(), slice.len()) }
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn test_io_slice_ext() {
34        let buffer = b"123455";
35        let inner: &'static [u8] = IoSlice::new(buffer).into_inner();
36
37        assert_eq!(inner, buffer);
38    }
39
40    #[test]
41    fn test_io_slice_mut_ext() {
42        let mut buffer = b"123455".to_vec();
43        let inner: &mut [u8] = IoSliceMut::new(&mut *buffer).into_inner();
44
45        assert_eq!(inner, b"123455");
46    }
47}