1use crate::{RDW_HEADER_LEN, RdwHeader};
2use copybook_error::Result;
3
4#[derive(Debug, Clone)]
6pub struct RDWRecord {
7 pub header: [u8; RDW_HEADER_LEN],
9 pub payload: Vec<u8>,
11}
12
13impl RDWRecord {
14 #[inline]
31 #[must_use = "Handle the Result or propagate the error"]
32 pub fn try_new(payload: Vec<u8>) -> Result<Self> {
33 let header = RdwHeader::from_payload_len(payload.len(), 0)?.bytes();
34 Ok(Self { header, payload })
35 }
36
37 #[inline]
42 #[must_use = "Handle the Result or propagate the error"]
43 pub fn try_with_reserved(payload: Vec<u8>, reserved: u16) -> Result<Self> {
44 let header = RdwHeader::from_payload_len(payload.len(), reserved)?.bytes();
45 Ok(Self { header, payload })
46 }
47
48 #[inline]
50 #[must_use]
51 pub fn length(&self) -> u16 {
52 RdwHeader::from_bytes(self.header).length()
53 }
54
55 #[inline]
57 #[must_use]
58 pub fn reserved(&self) -> u16 {
59 RdwHeader::from_bytes(self.header).reserved()
60 }
61
62 #[inline]
67 #[must_use = "Handle the Result or propagate the error"]
68 pub fn try_recompute_length(&mut self) -> Result<()> {
69 self.header = RdwHeader::from_payload_len(self.payload.len(), self.reserved())?.bytes();
70 Ok(())
71 }
72
73 #[inline]
75 #[must_use]
76 pub fn as_bytes(&self) -> Vec<u8> {
77 let mut result = Vec::with_capacity(RDW_HEADER_LEN + self.payload.len());
78 result.extend_from_slice(&self.header);
79 result.extend_from_slice(&self.payload);
80 result
81 }
82}