summaryrefslogtreecommitdiffstats
path: root/guide/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'guide/build.rs')
-rw-r--r--guide/build.rs70
1 files changed, 70 insertions, 0 deletions
diff --git a/guide/build.rs b/guide/build.rs
new file mode 100644
index 00000000..3d73a984
--- /dev/null
+++ b/guide/build.rs
@@ -0,0 +1,70 @@
+use std::env;
+use std::io::{self, Write, BufRead};
+use std::fs::{self, DirEntry};
+use std::ffi::OsString;
+use std::path::{Path, PathBuf};
+
+// one possible implementation of walking a directory only visiting files
+fn visit_dirs(dir: &Path, cb: &Fn(&DirEntry) -> io::Result<()>)
+ -> io::Result<()> {
+ if dir.is_dir() {
+ for entry in fs::read_dir(dir)? {
+ let entry = entry?;
+ let path = entry.path();
+ if path.is_dir() {
+ visit_dirs(&path, cb)?;
+ } else {
+ cb(&entry)?;
+ }
+ }
+ }
+ Ok(())
+}
+
+fn manifest_dir() -> PathBuf {
+ PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap())
+}
+
+fn out_dir() -> PathBuf {
+ env::var_os("OUT_DIR").unwrap().into()
+}
+
+fn lib_path() -> PathBuf {
+ out_dir().join("src/lib.rs")
+}
+
+fn translate_path(src: &Path) -> PathBuf {
+ let src = src.to_str().unwrap();
+ format!("{}rs", &src[..src.len() - 2]).into()
+}
+
+fn translate2rs(src: &DirEntry) -> io::Result<()> {
+ let path = src.path();
+ if path.extension() != Some(&OsString::from("md")) {
+ return Ok(());
+ }
+
+ let sink_filename = out_dir().join(
+ translate_path(&path).strip_prefix(&manifest_dir()).unwrap());
+
+ eprintln!("{:?} -> {:?}", path, sink_filename);
+ println!("rerun-if-changed={}", path.to_str().unwrap());
+
+ fs::create_dir_all(sink_filename.parent().unwrap())?;
+ let mut sink = fs::File::create(sink_filename)?;
+
+ for line in io::BufReader::new(fs::File::open(&path)?).lines() {
+ writeln!(&mut sink, "//! {}", line?)?;
+ }
+
+ let mut lib =
+ fs::OpenOptions::new().create(true).append(true).open(&lib_path())?;
+ writeln!(&mut lib, "pub mod {};", path.file_stem().unwrap().to_str().unwrap())?;
+
+ Ok(())
+}
+
+fn main() {
+ let _ = fs::remove_file(&lib_path());
+ visit_dirs(&manifest_dir().join("src"), &translate2rs).unwrap();
+}