gcd_rs/record/
firmware.rs1use byteorder::ByteOrder;
19use serde::{Deserialize, Serialize};
20use std::fmt::{Display, Formatter};
21use std::io::Result;
22
23use crate::RecordHeader;
24
25#[derive(Debug, PartialEq, Hash, Eq, Clone, Serialize, Deserialize)]
26pub enum FirmwareRecord {
27    EmptyChunk { id: u16 },
29    Chunk { id: u16, data: Vec<u8> },
31}
32
33impl Display for FirmwareRecord {
34    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
35        match self {
36            FirmwareRecord::EmptyChunk { id } => {
37                write!(f, "FirmwareRecord::EmptyChunk {{ id: {} }}", id)
38            }
39            FirmwareRecord::Chunk { id, data } => write!(
40                f,
41                "FirmwareRecord::Chunk {{ id: {}, len: {} }}",
42                id,
43                data.len()
44            ),
45        }
46    }
47}
48
49impl FirmwareRecord {
50    pub fn new(data: Vec<u8>, id: u16) -> Self {
51        if data.len() == 0 {
52            FirmwareRecord::EmptyChunk { id }
53        } else {
54            FirmwareRecord::Chunk { id, data }
55        }
56    }
57    pub fn len(&self) -> u16 {
58        match self {
59            FirmwareRecord::EmptyChunk { .. } => 0,
60            FirmwareRecord::Chunk { data, .. } => data.len() as u16,
61        }
62    }
63    pub const fn id(&self) -> u16 {
64        match self {
65            FirmwareRecord::EmptyChunk { id }
66            | FirmwareRecord::Chunk { id, .. } => *id,
67        }
68    }
69    pub fn data(&self) -> &[u8] {
70        match self {
71            FirmwareRecord::EmptyChunk { .. } => &[],
72            FirmwareRecord::Chunk { data, .. } => data,
73        }
74    }
75    pub fn record_to_raw<B: ByteOrder>(&self, data: &mut [u8]) -> Result<()> {
76        let next = RecordHeader::Unknown {
78            id: self.id(),
79            len: self.len(),
80        }
81        .to_raw::<B>(data)?;
82
83        next[..self.len() as usize].copy_from_slice(self.data());
85
86        Ok(())
87    }
88}