webview_bundle/
builder.rs1use 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}