1use crate::error::WriteError;
13
14pub trait Sink {
16 type Error;
18
19 fn write(&mut self, bytes: &[u8]) -> Result<(), Self::Error>;
25}
26
27#[derive(Debug)]
31pub struct SliceSink<'a> {
32 buf: &'a mut [u8],
33 len: usize,
34}
35
36impl<'a> SliceSink<'a> {
37 #[must_use]
39 pub fn new(buf: &'a mut [u8]) -> Self {
40 Self { buf, len: 0 }
41 }
42
43 #[must_use]
45 pub const fn len(&self) -> usize {
46 self.len
47 }
48
49 #[must_use]
51 pub const fn is_empty(&self) -> bool {
52 self.len == 0
53 }
54
55 #[must_use]
57 pub fn as_slice(&self) -> &[u8] {
58 &self.buf[..self.len]
59 }
60
61 #[must_use]
63 pub fn into_slice(self) -> &'a [u8] {
64 &self.buf[..self.len]
65 }
66}
67
68impl Sink for SliceSink<'_> {
69 type Error = WriteError;
70
71 #[inline]
72 fn write(&mut self, bytes: &[u8]) -> Result<(), WriteError> {
73 let end = self.len.checked_add(bytes.len()).ok_or(WriteError::BufferFull)?;
74 let dst = self.buf.get_mut(self.len..end).ok_or(WriteError::BufferFull)?;
75 dst.copy_from_slice(bytes);
76 self.len = end;
77 Ok(())
78 }
79}
80
81#[derive(Clone, Copy, Debug, Default)]
87pub struct CountSink {
88 len: u64,
89}
90
91impl CountSink {
92 #[must_use]
94 pub const fn new() -> Self {
95 Self { len: 0 }
96 }
97
98 #[must_use]
100 pub const fn len(&self) -> u64 {
101 self.len
102 }
103
104 #[must_use]
106 pub const fn is_empty(&self) -> bool {
107 self.len == 0
108 }
109}
110
111impl Sink for CountSink {
112 type Error = core::convert::Infallible;
113
114 #[inline]
115 fn write(&mut self, bytes: &[u8]) -> Result<(), Self::Error> {
116 self.len += bytes.len() as u64;
117 Ok(())
118 }
119}
120
121#[cfg(feature = "alloc")]
122impl Sink for alloc::vec::Vec<u8> {
123 type Error = core::convert::Infallible;
124
125 #[inline]
126 fn write(&mut self, bytes: &[u8]) -> Result<(), Self::Error> {
127 self.extend_from_slice(bytes);
128 Ok(())
129 }
130}
131
132#[cfg(feature = "std")]
134#[derive(Debug)]
135pub struct IoSink<W>(pub W);
136
137#[cfg(feature = "std")]
138impl<W: std::io::Write> Sink for IoSink<W> {
139 type Error = std::io::Error;
140
141 #[inline]
142 fn write(&mut self, bytes: &[u8]) -> Result<(), Self::Error> {
143 self.0.write_all(bytes)
144 }
145}