1use anyhow::{Result, anyhow};
2use std::path::Path;
3
4pub fn read_env_yaml(project_dir: &Path) -> Result<Option<Vec<u8>>> {
5 let p = project_dir.join("env.yaml");
6 match std::fs::read(&p) {
7 Ok(content) => Ok(Some(content)),
8 Err(e) if e.kind() == std::io::ErrorKind::NotFound => Ok(None),
9 Err(e) => Err(anyhow!("Failed to read {}: {}", p.display(), e)),
10 }
11}
12
13pub fn create_raw_bundle_wasm(
14 wasm_path: &Path,
15 env_yaml: Option<&[u8]>,
16 output_path: &Path,
17) -> Result<()> {
18 let file = std::fs::File::create(output_path)
19 .map_err(|e| anyhow!("Failed to create {}: {}", output_path.display(), e))?;
20 let mut builder = tar::Builder::new(file);
21 append_bytes(&mut builder, "manifest.json", br#"{"kind":"wasm"}"#)?;
22 let wasm_bytes = std::fs::read(wasm_path)
23 .map_err(|e| anyhow!("Failed to read {}: {}", wasm_path.display(), e))?;
24 append_bytes(&mut builder, "backend.wasm", &wasm_bytes)?;
25 if let Some(env) = env_yaml {
26 append_bytes(&mut builder, "env.yaml", env)?;
27 }
28 builder.finish()?;
29 Ok(())
30}
31
32pub fn create_raw_bundle_forte(
33 dist_dir: &Path,
34 env_yaml: Option<&[u8]>,
35 output_path: &Path,
36) -> Result<()> {
37 let file = std::fs::File::create(output_path)
38 .map_err(|e| anyhow!("Failed to create {}: {}", output_path.display(), e))?;
39 let mut builder = tar::Builder::new(file);
40 append_bytes(&mut builder, "manifest.json", br#"{"kind":"wasmjs"}"#)?;
41
42 let backend_wasm = dist_dir.join("backend.wasm");
43 let wasm_bytes = std::fs::read(&backend_wasm)
44 .map_err(|e| anyhow!("Failed to read {}: {}", backend_wasm.display(), e))?;
45 append_bytes(&mut builder, "backend.wasm", &wasm_bytes)?;
46
47 let server_js = dist_dir.join("server.js");
48 let server_bytes = std::fs::read(&server_js)
49 .map_err(|e| anyhow!("Failed to read {}: {}", server_js.display(), e))?;
50 append_bytes(&mut builder, "entry.js", &server_bytes)?;
51
52 if let Some(env) = env_yaml {
53 append_bytes(&mut builder, "env.yaml", env)?;
54 }
55
56 builder.finish()?;
57 Ok(())
58}
59
60fn append_bytes<W: std::io::Write>(
61 builder: &mut tar::Builder<W>,
62 path: &str,
63 data: &[u8],
64) -> Result<()> {
65 let mut header = tar::Header::new_gnu();
66 header.set_size(data.len() as u64);
67 header.set_mode(0o644);
68 header.set_cksum();
69 builder
70 .append_data(&mut header, path, data)
71 .map_err(|e| anyhow!("tar append failed for {}: {}", path, e))?;
72 Ok(())
73}