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}