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 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}