Skip to main content

WriteToBuffer

Trait WriteToBuffer 

pub trait WriteToBuffer {
    // Required methods
    fn write_to_buffer(&self, buf: &mut [u8]) -> Result<usize, &'static str>;
    fn num_bytes_required(&self) -> usize;
}
Expand description

A writer that serializes a struct and writes the byte sequence to a buffer.

§Examples

use grib_template_helpers::WriteToBuffer;

#[derive(Debug, PartialEq, Eq)]
struct VariableLength {
    len: u8,
    seq: Vec<u8>,
}

impl WriteToBuffer for VariableLength {
    fn write_to_buffer(&self, buf: &mut [u8]) -> Result<usize, &'static str> {
        if buf.len() < self.num_bytes_required() {
            return Err("destination buffer is too small");
        }

        let mut pos = 0;
        pos += self.len.write_to_buffer(&mut buf[pos..])?;
        for val in self.seq.iter() {
            pos += val.write_to_buffer(&mut buf[pos..])?;
        }
        Ok(pos)
    }

    fn num_bytes_required(&self) -> usize {
        1 + self.seq.len()
    }
}

let obj = VariableLength {
    len: 8,
    seq: (0..8).collect::<Vec<_>>(),
};

let mut buf = vec![0_u8; 12];
let result = obj.write_to_buffer(&mut buf);
assert_eq!(result, Ok(9));
assert_eq!(buf, vec![8, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0]);

let mut buf = vec![0_u8; 8];
let result = obj.write_to_buffer(&mut buf);
assert_eq!(result, Err("destination buffer is too small"));
assert_eq!(buf, vec![0; 8]);

Required Methods§

fn write_to_buffer(&self, buf: &mut [u8]) -> Result<usize, &'static str>

Performs writing and returns the number of bytes used.

fn num_bytes_required(&self) -> usize

Returns the number of bytes that are expected to be used for writing.

Dyn Compatibility§

This trait is dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementations on Foreign Types§

§

impl WriteToBuffer for f32

§

fn write_to_buffer(&self, buf: &mut [u8]) -> Result<usize, &'static str>

§

fn num_bytes_required(&self) -> usize

§

impl WriteToBuffer for i8

§

fn write_to_buffer(&self, buf: &mut [u8]) -> Result<usize, &'static str>

§

fn num_bytes_required(&self) -> usize

§

impl WriteToBuffer for i16

§

fn write_to_buffer(&self, buf: &mut [u8]) -> Result<usize, &'static str>

§

fn num_bytes_required(&self) -> usize

§

impl WriteToBuffer for i32

§

fn write_to_buffer(&self, buf: &mut [u8]) -> Result<usize, &'static str>

§

fn num_bytes_required(&self) -> usize

§

impl WriteToBuffer for u8

§

fn write_to_buffer(&self, buf: &mut [u8]) -> Result<usize, &'static str>

§

fn num_bytes_required(&self) -> usize

§

impl WriteToBuffer for u16

§

fn write_to_buffer(&self, buf: &mut [u8]) -> Result<usize, &'static str>

§

fn num_bytes_required(&self) -> usize

§

impl WriteToBuffer for u32

§

fn write_to_buffer(&self, buf: &mut [u8]) -> Result<usize, &'static str>

§

fn num_bytes_required(&self) -> usize

§

impl WriteToBuffer for u64

§

fn write_to_buffer(&self, buf: &mut [u8]) -> Result<usize, &'static str>

§

fn num_bytes_required(&self) -> usize

§

impl<T> WriteToBuffer for Option<T>
where T: WriteToBuffer,

§

fn write_to_buffer(&self, buf: &mut [u8]) -> Result<usize, &'static str>

§

fn num_bytes_required(&self) -> usize

§

impl<T> WriteToBuffer for Vec<T>
where T: WriteToBuffer,

§

fn write_to_buffer(&self, buf: &mut [u8]) -> Result<usize, &'static str>

§

fn num_bytes_required(&self) -> usize

§

impl<const N: usize> WriteToBuffer for [u8; N]

§

fn write_to_buffer(&self, buf: &mut [u8]) -> Result<usize, &'static str>

§

fn num_bytes_required(&self) -> usize

Implementors§

Source§

impl WriteToBuffer for ComplexPacking

Source§

impl WriteToBuffer for DataRepresentationTemplate

Source§

impl WriteToBuffer for EarthShape

Source§

impl WriteToBuffer for GaussianGrid

Source§

impl WriteToBuffer for Grid

Source§

impl WriteToBuffer for GridDefinitionTemplate

Source§

impl WriteToBuffer for IdentificationTemplate

Source§

impl WriteToBuffer for LatLonGrid

§

impl WriteToBuffer for NonStdLenUint<u16>

§

impl WriteToBuffer for NonStdLenUint<u32>

§

impl WriteToBuffer for NonStdLenUint<u64>

Source§

impl WriteToBuffer for ProjectionCentreFlag

Source§

impl WriteToBuffer for RefTime

Source§

impl WriteToBuffer for ResolutionAndComponentFlags

Source§

impl WriteToBuffer for Rotation

Source§

impl WriteToBuffer for ScanningMode

Source§

impl WriteToBuffer for Section0

Source§

impl WriteToBuffer for Section1Payload

Source§

impl WriteToBuffer for Section1PayloadOptional

Source§

impl WriteToBuffer for Section3Payload

Source§

impl WriteToBuffer for Section5Payload

Source§

impl WriteToBuffer for SectionHeader

Source§

impl WriteToBuffer for SimplePacking

Source§

impl WriteToBuffer for Template1_0

Source§

impl WriteToBuffer for Template1_1

Source§

impl WriteToBuffer for Template1_2

Source§

impl WriteToBuffer for Template3_0

Source§

impl WriteToBuffer for Template3_1

Source§

impl WriteToBuffer for Template3_20

Source§

impl WriteToBuffer for Template3_30

Source§

impl WriteToBuffer for Template3_40

Source§

impl WriteToBuffer for Template3_101

Source§

impl WriteToBuffer for Template5_0

Source§

impl WriteToBuffer for Template5_1

Source§

impl WriteToBuffer for Template5_2

Source§

impl WriteToBuffer for Template5_3

Source§

impl WriteToBuffer for Template5_4

Source§

impl WriteToBuffer for Template5_40

Source§

impl WriteToBuffer for Template5_41

Source§

impl WriteToBuffer for Template5_42

Source§

impl WriteToBuffer for Template5_50

Source§

impl WriteToBuffer for Template5_51

Source§

impl WriteToBuffer for Template5_53

Source§

impl WriteToBuffer for Template5_61

Source§

impl WriteToBuffer for Template5_200