flood_rs/
out_borrowed.rs

1/*
2 * Copyright (c) Peter Bjorklund. All rights reserved. https://github.com/piot/flood-rs
3 * Licensed under the MIT License. See LICENSE in the project root for license information.
4 */
5use 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    /// Returns the number of bytes written so far.
19    #[inline]
20    pub fn bytes_written(&self) -> usize {
21        self.offset
22    }
23
24    /// Returns the remaining capacity of the internal slice.
25    #[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}