use sha2::{Digest, Sha256};
use std::path::PathBuf;
pub fn generate_temp_file_path(
prefix: &str,
extension: &str,
content_hash: Option<&str>,
) -> PathBuf {
let id = if let Some(hash_content) = content_hash {
let mut hasher = Sha256::new();
hasher.update(hash_content.as_bytes());
let result = hasher.finalize();
format!("{:x}", result)[..16].to_string()
} else {
uuid::Uuid::new_v4().to_string()
};
let filename = format!("{}-{}-{}", prefix, id, extension);
let tmpdir = std::env::temp_dir();
tmpdir.join(filename)
}
pub fn generate_temp_file_path_default() -> PathBuf {
generate_temp_file_path("ai-prompt", ".md", None)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_generate_temp_file_path_default() {
let path = generate_temp_file_path_default();
assert!(path.to_string_lossy().contains("ai-prompt"));
assert!(path.to_string_lossy().ends_with(".md"));
}
#[test]
fn test_generate_temp_file_path_custom() {
let path = generate_temp_file_path("test-prefix", ".txt", None);
assert!(path.to_string_lossy().contains("test-prefix"));
assert!(path.to_string_lossy().ends_with(".txt"));
}
#[test]
fn test_generate_temp_file_path_with_content_hash() {
let content = "test content";
let path1 = generate_temp_file_path("ai-prompt", ".md", Some(content));
let path2 = generate_temp_file_path("ai-prompt", ".md", Some(content));
assert_eq!(path1, path2);
let path3 = generate_temp_file_path("ai-prompt", ".md", Some("different"));
assert_ne!(path1, path3);
}
#[test]
fn test_generate_temp_file_path_stability() {
let content = "stable content";
let path1 = generate_temp_file_path("ai-prompt", ".md", Some(content));
let path2 = generate_temp_file_path("ai-prompt", ".md", Some(content));
assert_eq!(path1, path2);
}
}