gib 0.1.1

A .gitignore bootstrapper for projects that use git
Documentation
use std::{
    env,
    error::Error,
    fs::{self, File},
    io::{self, Write},
    path::{Path, PathBuf},
};

const GITIGNORE_DIR: &str = "gitignore";

fn main() -> Result<(), Box<dyn Error>> {
    let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
    d.push(GITIGNORE_DIR);

    let out_dir = env::var("OUT_DIR")?;
    let dest_path = Path::new(&out_dir).join("gitignore_data.rs");
    let mut gitignore_data = File::create(&dest_path)?;

    let mut path_vec = Vec::new();

    visit_dirs(&d, &mut path_vec)?;

    writeln!(&mut gitignore_data, r#"["#,)?;
    for path in path_vec {
        let filename = path.file_stem().unwrap().to_str().unwrap();
        let filepath = path.display();
        writeln!(
            &mut gitignore_data,
            r###"("{}", ("{}", include_bytes!(r#"{}"#))),"###,
            filename.to_lowercase(),
            filename,
            filepath,
        )?;
    }
    writeln!(&mut gitignore_data, r#"]"#,)?;

    println!("cargo:rerun-if-changed=build.rs");

    Ok(())
}

fn visit_dirs(dir: &Path, path_vec: &mut Vec<PathBuf>) -> 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, path_vec)?;
            } else {
                match path.extension() {
                    Some(ext) => {
                        if ext == "gitignore" {
                            path_vec.push(path)
                        }
                    }
                    None => continue,
                }
            }
        }
    }
    Ok(())
}