use sha2::{Digest, Sha256};
pub fn claude_project_folder(abs_path: &str) -> String {
abs_path
.chars()
.map(|c| match c {
'/' | '.' | '_' => '-',
other => other,
})
.collect()
}
pub fn gemini_project_hash(abs_path: &str) -> String {
let digest = Sha256::digest(abs_path.as_bytes());
let mut s = String::with_capacity(digest.len() * 2);
for b in digest {
s.push_str(&format!("{b:02x}"));
}
s
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn claude_folder_matches_the_observed_encoding() {
assert_eq!(
claude_project_folder("/home/dev/myproject"),
"-home-dev-myproject"
);
assert_eq!(
claude_project_folder("/home/dev/my_project"),
"-home-dev-my-project"
);
assert_eq!(
claude_project_folder("/home/dev/.config"),
"-home-dev--config"
);
assert_eq!(
claude_project_folder("/home/dev/a.b/c_d"),
"-home-dev-a-b-c-d"
);
}
#[test]
fn gemini_hash_is_sha256_of_the_path() {
assert_eq!(
gemini_project_hash("/home/dev/myproject"),
"5ea998fd0e431a6b5f864ca7d6386eacfa7b33d53df16df5f0faeb1c0cd2d021"
);
}
}