product_os_cursor/
cursor.rs

1use crate::{Result, Error};
2
3pub struct Cursor<T> {
4    inner: T,
5    position: usize,
6}
7
8impl<T> Cursor<T> {
9    pub fn new(inner: T) -> Self {
10        Self {
11            inner,
12            position: 0,
13        }
14    }
15
16    pub fn position(&self) -> usize {
17        self.position
18    }
19
20    pub fn set_position(&mut self, position: usize) {
21        self.position = position;
22    }
23
24    pub fn get_ref(&self) -> &T {
25        &self.inner
26    }
27
28    pub fn get_mut_ref(&mut self) -> &mut T {
29        &mut self.inner
30    }
31}
32
33impl<T: AsRef<[u8]>> Cursor<T> {
34    pub fn remaining_slice(&self) -> &[u8] {
35        let len = self.position.min(self.inner.as_ref().len());
36
37        &self.inner.as_ref()[len..]
38    }
39
40    pub fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
41        let slice = self.remaining_slice();
42        let amt = buf.len().min(slice.len());
43        let a = &slice[..amt];
44
45        if amt == 1 {
46            buf[0] = a[0];
47        } else {
48            buf[..amt].copy_from_slice(a);
49        }
50
51        self.position += amt;
52
53        Ok(amt)
54    }
55
56    pub fn read_exact(&mut self, buf: &mut [u8]) -> Result<()> {
57        let slice = self.remaining_slice();
58        if buf.len() > slice.len() {
59            return Err(Error::UnexpectedEof);
60        }
61        let a = &slice[..buf.len()];
62
63        if buf.len() == 1 {
64            buf[0] = a[0];
65        } else {
66            buf.copy_from_slice(a);
67        }
68
69        self.position += buf.len();
70
71        Ok(())
72    }
73}
74
75impl Cursor<&mut [u8]> {
76    pub fn remaining_slice_mut(&mut self) -> &mut [u8] {
77        let len = self.position.min(self.inner.as_mut().len());
78
79        &mut self.inner.as_mut()[len..]
80    }
81
82    pub fn write(&mut self, data: &[u8]) -> Result<usize> {
83        let slice = self.remaining_slice_mut();
84        let amt = data.len().min(slice.len());
85
86        slice[..amt].copy_from_slice(&data[..amt]);
87
88        self.position += amt;
89
90        Ok(amt)
91    }
92}
93
94impl<const N: usize> Cursor<[u8; N]> {
95    pub fn remaining_slice_mut(&mut self) -> &mut [u8] {
96        let len = self.position.min(self.inner.as_mut().len());
97
98        &mut self.inner.as_mut()[len..]
99    }
100
101    pub fn write(&mut self, data: &[u8]) -> Result<usize> {
102        let slice = self.remaining_slice_mut();
103        let amt = data.len().min(slice.len());
104
105        slice[..amt].copy_from_slice(&data[..amt]);
106
107        self.position += amt;
108
109        Ok(amt)
110    }
111}
112
113impl<T: AsRef<[u8]>> AsRef<T> for Cursor<T> {
114    fn as_ref(&self) -> &T {
115        &self.inner
116    }
117}