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