dotnetdll/binary/
stream.rs1use scroll::{
2 Pread, Pwrite,
3 ctx::{StrCtx, TryFromCtx, TryIntoCtx},
4};
5
6#[derive(Debug)]
13pub struct Header<'a> {
14 pub offset: u32,
16 pub size: u32,
18 pub name: &'a str,
20}
21
22impl<'a> TryFromCtx<'a> for Header<'a> {
23 type Error = scroll::Error;
24
25 fn try_from_ctx(from: &'a [u8], (): ()) -> Result<(Self, usize), Self::Error> {
26 let offset = &mut 0;
27 let stream_offset = from.gread_with(offset, scroll::LE)?;
28 let stream_size = from.gread_with(offset, scroll::LE)?;
29
30 let name = from.gread_with(offset, StrCtx::Delimiter(0))?;
31
32 *offset = crate::utils::round_up_to_4(*offset).0;
33
34 let obj = Header {
35 offset: stream_offset,
36 size: stream_size,
37 name,
38 };
39 Ok((obj, *offset))
40 }
41}
42impl TryIntoCtx for Header<'_> {
43 type Error = scroll::Error;
44
45 fn try_into_ctx(self, into: &mut [u8], (): ()) -> Result<usize, Self::Error> {
46 let offset = &mut 0;
47
48 into.gwrite_with(self.offset, offset, scroll::LE)?;
49 into.gwrite_with(self.size, offset, scroll::LE)?;
50
51 into.gwrite(self.name, offset)?;
53 into.gwrite_with(0_u8, offset, scroll::LE)?;
54
55 *offset = crate::utils::round_up_to_4(*offset).0;
57
58 Ok(*offset)
59 }
60}