1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//! Create files in the WEBC format.
//!
//! If you have landed on this page, you are probably looking for the [`Writer`]
//! type.
//!
//! The [`Writer`] uses [*The Typestate Pattern*][tsp] to ensure that each
//! section of the WEBC file is written in the correct order.
//!
//! # Examples
//!
//! ```rust,no_run
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! use webc::{
//!     metadata::Manifest,
//!     v2::{
//!         write::{Writer, Directory, FileEntry},
//!         ChecksumAlgorithm, SignatureAlgorithm,
//!     },
//! };
//! use std::collections::BTreeMap;
//! use bytes::Bytes;
//!
//! let manifest = Manifest::default();
//!
//! let mut atoms = BTreeMap::new();
//! atoms.insert("python".parse()?, FileEntry::Borrowed(b"..."));
//!
//! let mut writer = Writer::new(ChecksumAlgorithm::Sha256)
//!     .write_manifest(&manifest)?
//!     .write_atoms(atoms)?;
//!
//! let volume_1 = Directory::from_path("./volume_1")?;
//! writer.write_volume("volume_1", volume_1)?;
//!
//! let buffer: Bytes = writer.finish(SignatureAlgorithm::None)?;
//! # Ok(()) }
//! ```
//!
//! [tsp]: http://cliffle.com/blog/rust-typestate/

pub(crate) mod volumes;
mod writer;

pub use self::{
    volumes::{DirEntry, Directory, FileEntry},
    writer::{Writer, WritingAtoms, WritingManifest, WritingVolumes},
};

pub(crate) use self::writer::Section;