webview_bundle/
encoder.rs1use crate::bundle::{Bundle, FileDescriptor, Version, HEADER_MAGIC_BYTES};
2use bincode::{config, encode_to_vec};
3use std::io::Write;
4
5pub fn encode<W: Write>(bundle: &Bundle, write: W) -> crate::Result<()> {
6 Encoder::new(write).encode(bundle)?;
7 Ok(())
8}
9
10pub fn encode_bytes(bundle: &Bundle) -> crate::Result<Vec<u8>> {
11 let mut write = Vec::new();
12 encode(bundle, &mut write)?;
13 Ok(write)
14}
15
16struct Encoder<W: Write> {
17 w: W,
18}
19
20impl<W: Write> Encoder<W> {
21 fn new(w: W) -> Self {
22 Self { w }
23 }
24
25 fn encode(&mut self, bundle: &Bundle) -> crate::Result<()> {
26 self.write_magic()?;
27 self.write_version(&bundle.version)?;
28 self.write_file_descriptors(&bundle.descriptors)?;
29 self.w.write_all(&bundle.data)?;
30 Ok(())
31 }
32
33 fn write_magic(&mut self) -> crate::Result<()> {
34 self.w.write_all(&HEADER_MAGIC_BYTES)?;
35 Ok(())
36 }
37
38 fn write_version(&mut self, version: &Version) -> crate::Result<()> {
39 self.w.write_all(version.bytes())?;
40 Ok(())
41 }
42
43 fn write_file_descriptors(&mut self, descriptors: &Vec<FileDescriptor>) -> crate::Result<()> {
44 let mut encoded: Vec<u8> = vec![];
45 let config = config::standard().with_big_endian();
46 let bytes = encode_to_vec(descriptors, config)?;
47 let bytes_len = (bytes.len() as u32).to_be_bytes();
48 encoded.extend_from_slice(&bytes_len);
49 encoded.extend_from_slice(&bytes);
50 self.w.write_all(&encoded)?;
51 Ok(())
52 }
53}
54
55#[cfg(test)]
56mod tests {
57 use super::*;
58 use std::path::Path;
59
60 #[test]
61 fn encode_ok() {
62 let path = Path::new("index.js");
63 let file = r#"const a = 10;"#;
64 let bundle = Bundle::builder().add_file(path, file.as_bytes()).build();
65 let mut write = Vec::new();
66 encode(&bundle, &mut write).unwrap();
67 assert_eq!(
68 write,
69 [
70 240, 159, 140, 144, 240, 159, 142, 129, 118, 49, 0, 0, 0, 0, 0, 12, 1, 8, 105, 110, 100,
71 101, 120, 46, 106, 115, 0, 18, 13, 0, 0, 0, 208, 99, 111, 110, 115, 116, 32, 97, 32, 61,
72 32, 49, 48, 59
73 ]
74 );
75 }
76}