use walkdir::{DirEntry, WalkDir};

fn is_hidden(entry: &DirEntry) -> bool {
    entry
        .file_name()
        .to_str()
        .map(|s| s.starts_with('.'))
        .unwrap_or(false)
}

fn generate_api() {
    println!("cargo:rerun-if-changed=schema");
    let mut compile_command = ::capnpc::CompilerCommand::new();
    compile_command
        .src_prefix("schema")
        .default_parent_module(vec!["schema".to_string()]);

    for entry in WalkDir::new("schema")
        .max_depth(2)
        .into_iter()
        .filter_entry(|e| !is_hidden(e))
        .filter_map(Result::ok) // Filter all entries that access failed on
        .filter(|e| !e.file_type().is_dir()) // Filter directories
        // Filter non-schema files
        .filter(|e| {
            e.file_name()
                .to_str()
                .map(|s| s.ends_with(".capnp"))
                .unwrap_or(false)
        })
    {
        println!("Collecting schema file {}", entry.path().display());
        compile_command.file(entry.path());
    }

    println!("Compiling schemas...");
    compile_command.run().expect("Failed to generate API code");
}

fn main() {
    generate_api();
}