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}