gcd_rs/record/
filler.rs

1use byteorder::ByteOrder;
2use serde::{Deserialize, Serialize};
3use std::fmt::{Display, Formatter};
4use std::io::{Error, ErrorKind, Result};
5
6use crate::{RecordHeader, RECORD_HEADER_LEN};
7
8pub const ID: u16 = 2;
9#[derive(Debug, PartialEq, Hash, Eq, Clone, Serialize, Deserialize)]
10#[non_exhaustive]
11pub enum FillerRecord {
12    Zeros(u16),
13}
14
15impl Display for FillerRecord {
16    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
17        match self {
18            FillerRecord::Zeros(len) => {
19                write!(f, "FillerRecord:Zeros({})", len)
20            }
21        }
22    }
23}
24
25impl FillerRecord {
26    pub fn new(data: &[u8]) -> Result<Self> {
27        if data.iter().find(|&x| *x != 0).is_some() {
28            return Err(Error::new(
29                ErrorKind::InvalidInput,
30                "Invalid Filler Record value",
31            ));
32        }
33        Ok(FillerRecord::Zeros(data.len() as u16))
34    }
35    pub const fn len(&self) -> u16 {
36        match self {
37            FillerRecord::Zeros(len) => *len,
38        }
39    }
40    pub fn header(&self) -> RecordHeader {
41        RecordHeader::Filler(self.len())
42    }
43    pub fn record_to_raw<B: ByteOrder>(&self, data: &mut [u8]) -> Result<()> {
44        //write header
45        self.header().to_raw::<B>(data)?;
46        data[RECORD_HEADER_LEN..RECORD_HEADER_LEN + self.len() as usize]
47            .fill(0);
48
49        Ok(())
50    }
51}