cargo-mend 0.16.0

Opinionated visibility auditing for Rust crates and workspaces
use std::collections::hash_map::DefaultHasher;
use std::hash::Hash;
use std::hash::Hasher;
use std::path::Path;

#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum CacheBuildKind {
    Library,
    Test,
}

pub fn cache_filename_for(
    package_root: &Path,
    crate_root_file: &Path,
    build_kind: CacheBuildKind,
) -> String {
    let mut hasher = DefaultHasher::new();
    package_root.hash(&mut hasher);
    crate_root_file.hash(&mut hasher);
    build_kind.hash(&mut hasher);
    format!("{:016x}.json", hasher.finish())
}

#[cfg(test)]
mod tests {
    use std::path::Path;

    use super::CacheBuildKind;
    use super::cache_filename_for;

    #[test]
    fn cache_filename_for_separates_library_and_test_builds() {
        let package_root = Path::new("/package");
        let crate_root = Path::new("/package/src/lib.rs");

        assert_ne!(
            cache_filename_for(package_root, crate_root, CacheBuildKind::Library),
            cache_filename_for(package_root, crate_root, CacheBuildKind::Test)
        );
    }
}