Skip to main content

vtcode_core/tools/
generation_helpers.rs

1//! # Generation Helpers
2//!
3//! Provides utilities for tracking and verifying files generated through code execution,
4//! skills, and other tools. This addresses the common pattern where users ask "where is it?"
5//! after file generation.
6
7use crate::tools::file_tracker::FileTracker;
8use anyhow::Result;
9use serde_json::Value;
10use std::path::PathBuf;
11
12/// Helper for ensuring generated files are properly tracked and reported
13pub struct GenerationHelper {
14    file_tracker: FileTracker,
15}
16
17impl GenerationHelper {
18    pub fn new(workspace_root: PathBuf) -> Self {
19        Self { file_tracker: FileTracker::new(workspace_root) }
20    }
21
22    /// Creates a verification message for a specific file
23    pub async fn verify_and_report(&self, filename: &str) -> Result<String> {
24        match self.file_tracker.verify_file_exists(filename).await? {
25            Some(file_info) => {
26                Ok(format!("✓ Generated: {} ({} bytes)", file_info.absolute_path.display(), file_info.size))
27            }
28            None => Ok(format!(
29                "⚠ File not found: {filename}. Generation may have failed or file was created in a different location."
30            )),
31        }
32    }
33
34    /// Generates a complete response with file verification
35    pub async fn create_verified_response(&self, filename: &str, additional_info: Option<&str>) -> Result<String> {
36        let file_report = self.verify_and_report(filename).await?;
37
38        let response = if let Some(info) = additional_info {
39            format!("{info}\n\n{file_report}")
40        } else {
41            file_report
42        };
43
44        Ok(response)
45    }
46
47    /// Creates a JSON response suitable for tool execution results
48    pub async fn create_json_response(&self, filename: &str, metadata: Value) -> Result<Value> {
49        let verification = self.file_tracker.verify_file_exists(filename).await?;
50
51        Ok(serde_json::json!({
52            "status": "completed",
53            "filename": filename,
54            "verification": verification.map(|f| f.to_json()),
55            "metadata": metadata,
56        }))
57    }
58}
59
60/// Quick verification function for immediate file existence check
61pub async fn quick_verify(workspace_root: PathBuf, filename: &str) -> Result<String> {
62    let helper = GenerationHelper::new(workspace_root);
63    helper.verify_and_report(filename).await
64}
65
66#[cfg(test)]
67mod tests {
68    use super::*;
69    use tempfile::TempDir;
70
71    #[tokio::test]
72    async fn test_verification_message() {
73        let temp_dir = TempDir::new().unwrap();
74        let helper = GenerationHelper::new(temp_dir.path().to_path_buf());
75
76        // Test non-existent file
77        let result = helper.verify_and_report("test.pdf").await.unwrap();
78        assert!(result.contains("⚠ File not found"));
79    }
80
81    #[tokio::test]
82    async fn test_create_verified_response() {
83        let temp_dir = TempDir::new().unwrap();
84        let helper = GenerationHelper::new(temp_dir.path().to_path_buf());
85
86        let response = helper
87            .create_verified_response("test.pdf", Some("Additional info"))
88            .await
89            .unwrap();
90
91        assert!(response.contains("Additional info"));
92        assert!(response.contains("⚠ File not found"));
93    }
94}