aboutsummaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..939b958
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,52 @@
+extern crate walkdir;
+extern crate phf_codegen;
+
+use std::{env, io};
+use std::fs::File;
+use std::io::{BufWriter, Write};
+use std::path::Path;
+
+use walkdir::WalkDir;
+
+pub fn build<P: AsRef<Path>>(dir: P) -> io::Result<()> {
+ let dir = dir.as_ref();
+
+ let base_path = Path::new(&env::var("CARGO_MANIFEST_DIR").unwrap()).to_owned();
+
+ let dir_name = dir.file_name().expect("Invalid directory name").to_string_lossy();
+ let out_name = format!("dir_{}.rs", dir_name);
+ let out_path = Path::new(&env::var("OUT_DIR").unwrap()).join(out_name);
+ let mut out_file = BufWriter::new(File::create(&out_path).unwrap());
+
+ write!(&mut out_file,
+ "static FILES: phf::Map<&'static str, &'static [u8]> = ")
+ .unwrap();
+
+ // FIXME: rustfmt mangles this
+ let entries: Vec<(String, String)> = WalkDir::new(dir)
+ .into_iter()
+ .filter(|e| {
+ !e.as_ref()
+ .ok()
+ .map_or(true, |e| e.file_type().is_dir())
+ })
+ .map(|e| {
+ let entry = e.expect("Invalid dir entry.");
+ let name = format!("{}", entry.path().display());
+ let code = format!("include_bytes!(\"{}\") \
+ as &'static [u8]",
+ base_path.join(entry.path())
+ .display());
+ (name, code)
+ })
+ .collect();
+
+ let mut map: phf_codegen::Map<&str> = phf_codegen::Map::new();
+ for &(ref name, ref code) in &entries {
+ map.entry(name, code);
+ }
+ map.build(&mut out_file).unwrap();
+
+ write!(&mut out_file, ";\n").unwrap();
+ Ok(())
+}