1use crate::WriteOctetStream;
6use std::io::{Error, ErrorKind, Result};
7
8pub struct OctetRefWriter<'a> {
9 data: &'a mut [u8],
10 offset: usize,
11}
12
13impl<'a> OctetRefWriter<'a> {
14 pub fn new(data: &'a mut [u8]) -> Self {
15 Self { data, offset: 0 }
16 }
17
18 #[inline]
20 pub fn bytes_written(&self) -> usize {
21 self.offset
22 }
23
24 #[inline]
26 pub fn remaining_capacity(&self) -> usize {
27 self.data.len() - self.offset
28 }
29
30 fn ensure_capacity(&self, additional: usize) -> Result<()> {
31 if self.remaining_capacity() < additional {
32 return Err(Error::new(
33 ErrorKind::WriteZero,
34 "Not enough capacity in buffer",
35 ));
36 }
37 Ok(())
38 }
39
40 pub fn data(&mut self) -> &mut [u8] {
41 self.data
42 }
43}
44
45impl<'a> WriteOctetStream for OctetRefWriter<'a> {
46 fn write_u64(&mut self, v: u64) -> Result<()> {
47 self.ensure_capacity(8)?;
48 self.data[self.offset..self.offset + 8].copy_from_slice(&v.to_be_bytes());
49 self.offset += 8;
50 Ok(())
51 }
52
53 fn write_i64(&mut self, v: i64) -> Result<()> {
54 self.write_u64(v as u64)
55 }
56
57 fn write_u32(&mut self, v: u32) -> Result<()> {
58 self.ensure_capacity(4)?;
59 self.data[self.offset..self.offset + 4].copy_from_slice(&v.to_be_bytes());
60 self.offset += 4;
61 Ok(())
62 }
63
64 fn write_i32(&mut self, v: i32) -> Result<()> {
65 self.write_u32(v as u32)
66 }
67
68 fn write_u16(&mut self, v: u16) -> Result<()> {
69 self.ensure_capacity(2)?;
70 self.data[self.offset..self.offset + 2].copy_from_slice(&v.to_be_bytes());
71 self.offset += 2;
72 Ok(())
73 }
74
75 fn write_i16(&mut self, v: i16) -> Result<()> {
76 self.write_u16(v as u16)
77 }
78
79 fn write_u8(&mut self, v: u8) -> Result<()> {
80 self.ensure_capacity(1)?;
81 self.data[self.offset] = v;
82 self.offset += 1;
83 Ok(())
84 }
85
86 fn write_i8(&mut self, v: i8) -> Result<()> {
87 self.write_u8(v as u8)
88 }
89
90 fn write(&mut self, buf: &[u8]) -> Result<()> {
91 self.ensure_capacity(buf.len())?;
92 self.data[self.offset..self.offset + buf.len()].copy_from_slice(buf);
93 self.offset += buf.len();
94 Ok(())
95 }
96}