webview_bundle/
builder.rs

1use crate::bundle::{FileDescriptorData, FileDescriptors};
2use crate::{Bundle, Version};
3use lz4_flex::compress_prepend_size;
4
5#[derive(Default, Clone)]
6pub struct Builder {
7  version: Option<Version>,
8  offset: u32,
9  descriptors: FileDescriptors,
10  data: Vec<u8>,
11}
12
13impl Builder {
14  pub(crate) fn new() -> Self {
15    Default::default()
16  }
17
18  pub fn version(mut self, version: Version) -> Self {
19    self.version = Some(version);
20    self
21  }
22
23  pub fn add_file(mut self, path: &str, data: &[u8]) -> Self {
24    let compressed = compress_prepend_size(data);
25    let length = compressed.len() as u32;
26    self.descriptors.insert(
27      path.to_string(),
28      FileDescriptorData::new(self.offset, length),
29    );
30    self.offset += length;
31    self.data.extend_from_slice(&compressed);
32    self
33  }
34
35  pub fn build(self) -> Bundle {
36    let version = self.version.unwrap_or_default();
37    Bundle {
38      version,
39      descriptors: self.descriptors,
40      data: self.data,
41    }
42  }
43}
44
45#[cfg(test)]
46mod tests {
47  use super::*;
48
49  #[test]
50  fn build() {
51    let data = r#"
52const a = 10;
53export a;
54    "#;
55    let bundle = Builder::new().add_file("index.js", data.as_bytes()).build();
56    assert_eq!(bundle.version(), &Version::Version1);
57    assert_eq!(bundle.descriptors.len(), 1);
58    assert_eq!(
59      bundle.descriptors.get("index.js").unwrap(),
60      &FileDescriptorData::new(0, 35)
61    );
62  }
63}