about summary refs log tree commit diff
path: root/templates/build.rs
blob: bdf99fa001133a939f14e55b03aa17168f966779 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
use std::ffi::OsStr;

use libflate::gzip::Encoder;
use walkdir::WalkDir;

fn main() -> Result<(), std::io::Error> {
    use std::env;
    let out_dir = std::path::PathBuf::from(env::var("OUT_DIR").unwrap());

    println!("cargo:rerun-if-changed=javascript/");
    if let Ok(exit) = std::process::Command::new("tsc")
        .arg("--outDir")
        .arg(&out_dir)
        .current_dir("javascript")
        .spawn()?
        .wait()
    {
        if !exit.success() {
            std::process::exit(exit.code().unwrap_or(1))
        }
    }

    println!("cargo:rerun-if-changed=assets/");
    let assets_path = std::path::Path::new("assets");
    let mut assets = WalkDir::new(&assets_path)
        .into_iter();
    while let Some(Ok(entry)) = assets.next() {
        if entry.file_type().is_dir() {
            if let Err(err) = std::fs::create_dir(&out_dir.join(entry.path())) {
                if err.kind() != std::io::ErrorKind::AlreadyExists {
                    return Err(err)
                }
            }
        } else {
            std::fs::copy(entry.path(), &out_dir.join(entry.path().strip_prefix(assets_path).unwrap()))?;
        }
    }

    let walker = WalkDir::new(&out_dir)
        .into_iter()
        .map(Result::unwrap)
        .filter(|e| {
            e.file_type().is_file() && e.path().extension().unwrap() != "gz"
        });
    for entry in walker {
        let normal_path = entry.path();
        let gzip_path = normal_path.with_extension({
            let mut extension = normal_path
                .extension()
                .unwrap()
                .to_owned();
            extension.push(OsStr::new(".gz"));
            extension
        });
        eprintln!(
            "{} -> {}",
            normal_path.strip_prefix(&out_dir).unwrap().display(),
            gzip_path.strip_prefix(&out_dir).unwrap().display()
        );
        {
            let mut out_file = std::fs::OpenOptions::new()
                .create(true)
                .truncate(true)
                .write(true)
                .open(&gzip_path)?;

            let mut in_file = std::fs::File::open(&normal_path)?;

            let mut encoder = Encoder::new(&mut out_file)?;
            std::io::copy(&mut in_file, &mut encoder)?;
            encoder.finish().into_result()?;
        }

        let normal_len: f64 = std::fs::metadata(&normal_path).unwrap().len() as f64;
        let gzipped_len: f64 = std::fs::metadata(&gzip_path).unwrap().len() as f64;
        let ratio = gzipped_len / normal_len;
        eprintln!("Ratio: {}", ratio);
        if ratio <= 0.9 {
            std::fs::remove_file(&normal_path)?
        } else {
            println!(
                "cargo:warning={} compression ratio is {} (> 0.9), leaving as is",
                entry.path().display(),
                ratio
            );
            std::fs::remove_file(&gzip_path)?
        }
    }
    Ok(())
}