use std::path::PathBuf;
pub fn image_to_prompt_reference(
image_bytes: &[u8],
filename: &str,
) -> std::io::Result<(PathBuf, String)> {
let dir = resolve_temp_dir();
let path = dir.join(filename);
std::fs::write(&path, image_bytes)?;
let prompt = format!("Analyze this image: {}", path.display());
Ok((path, prompt))
}
fn resolve_temp_dir() -> PathBuf {
if cfg!(windows) {
std::env::var("USERPROFILE")
.map(PathBuf::from)
.unwrap_or_else(|_| std::env::temp_dir())
.join("AppData")
.join("Local")
.join("Temp")
} else {
std::env::temp_dir()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn image_to_prompt_reference_writes_file_and_returns_path() {
let bytes = b"fake image data";
let filename = "gate4agent_test_image.bin";
let (path, prompt) = image_to_prompt_reference(bytes, filename)
.expect("should write temp file");
assert!(path.exists(), "temp file must exist after write");
assert_eq!(std::fs::read(&path).unwrap(), bytes);
assert!(
prompt.contains(&path.display().to_string()),
"prompt must contain the absolute path"
);
let _ = std::fs::remove_file(&path);
}
#[test]
fn image_to_prompt_reference_prefix() {
let bytes = b"x";
let (path, prompt) = image_to_prompt_reference(bytes, "gate4agent_prefix_test.bin")
.unwrap();
assert!(
prompt.starts_with("Analyze this image: "),
"prompt must start with the standard prefix, got: {prompt}"
);
let _ = std::fs::remove_file(&path);
}
}