webview_bundle/
builder.rs

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