caff_archive/
archive.rs

1use crate::prelude::*;
2
3mod body;
4mod entry;
5mod header;
6mod key;
7
8pub use body::Body;
9pub use entry::Metadata;
10pub use header::Header;
11pub use key::Key;
12
13#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
14pub struct Archive {
15  pub header: Header,
16  pub body: Body,
17}
18
19impl Archive {
20  pub fn read<R: Read + Seek>(reader: &mut R) -> Result<Self> {
21    reader.trace(|reader| {
22      let header = Header::read(reader)?;
23      let body = Body::read(reader, header.key)?;
24
25      let value = Self { header, body };
26
27      Ok(value)
28    })
29  }
30
31  pub fn write<W: Write + Seek>(&self, writer: &mut W) -> Result<()> {
32    writer.trace(|writer| {
33      let Self { header, body } = self;
34
35      header.write(writer)?;
36      body.write(writer, header.key)?;
37
38      Ok(())
39    })
40  }
41}