Blog attempt 5
1use std::{env, error::Error, fs::copy, path::PathBuf, process::Command};
2
3use rand::distr::Alphabetic;
4use vergen_git2::{BuildBuilder, CargoBuilder, Emitter, Git2Builder, RustcBuilder, SysinfoBuilder};
5
6pub fn main() -> Result<(), Box<dyn Error>> {
7 vergen()?;
8 bundle_js()?;
9
10 Ok(())
11}
12
13pub fn bundle_js() -> Result<(), Box<dyn Error>> {
14 use rand::Rng;
15 let mut rng = rand::rng();
16
17 // println!("cargo::rerun-if-changed=src/index.js");
18 // println!("cargo::rerun-if-changed=src/login.js");
19 // println!("cargo::rerun-if-changed=src/bun.lock");
20
21 let env_name = "CACHEBUSTING-HASH";
22 let env_var: String = (&mut rng)
23 .sample_iter(Alphabetic)
24 .take(16)
25 .map(char::from)
26 .collect();
27
28 println!("cargo:rustc-env={env_name}={env_var}");
29
30 let out_dir = PathBuf::from(env::var("OUT_DIR")?);
31 let out_dir = out_dir.to_str().ok_or("malformed osstr")?;
32
33 let status = Command::new("bun")
34 .args([
35 "build",
36 &format!("--outfile={out_dir}/bundle-{env_var}.js"),
37 "src/index.js",
38 ])
39 .status()?;
40 assert!(status.success());
41
42 let _ = std::fs::remove_file(format!("{out_dir}/modern-normalize.css"));
43 copy(
44 "node_modules/modern-normalize/modern-normalize.css",
45 format!("{out_dir}/modern-normalize.css"),
46 )?;
47
48 // println!("cargo:rerun-if-changed=bundle.js");
49
50 Ok(())
51}
52
53// NOTE: This will output everything, and requires all features enabled.
54// NOTE: See the specific builder documentation for configuration options.
55pub fn vergen() -> Result<(), Box<dyn Error>> {
56 let build = BuildBuilder::all_build()?;
57 let cargo = CargoBuilder::all_cargo()?;
58 let git2 = Git2Builder::all_git()?;
59 let rustc = RustcBuilder::all_rustc()?;
60 let si = SysinfoBuilder::all_sysinfo()?;
61
62 Emitter::default()
63 .add_instructions(&build)?
64 .add_instructions(&cargo)?
65 .add_instructions(&git2)?
66 .add_instructions(&rustc)?
67 .add_instructions(&si)?
68 .emit()?;
69
70 Ok(())
71}