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 {
20            file_tracker: FileTracker::new(workspace_root),
21        }
22    }
23
24    /// Creates a verification message for a specific file
25    pub async fn verify_and_report(&self, filename: &str) -> Result<String> {
26        match self.file_tracker.verify_file_exists(filename).await? {
27            Some(file_info) => Ok(format!(
28                "✓ Generated: {} ({} bytes)",
29                file_info.absolute_path.display(),
30                file_info.size
31            )),
32            None => Ok(format!(
33                "⚠ File not found: {}. Generation may have failed or file was created in a different location.",
34                filename
35            )),
36        }
37    }
38
39    /// Generates a complete response with file verification
40    pub async fn create_verified_response(
41        &self,
42        filename: &str,
43        additional_info: Option<&str>,
44    ) -> Result<String> {
45        let file_report = self.verify_and_report(filename).await?;
46
47        let response = if let Some(info) = additional_info {
48            format!("{}\n\n{}", info, file_report)
49        } else {
50            file_report
51        };
52
53        Ok(response)
54    }
55
56    /// Creates a JSON response suitable for tool execution results
57    pub async fn create_json_response(&self, filename: &str, metadata: Value) -> Result<Value> {
58        let verification = self.file_tracker.verify_file_exists(filename).await?;
59
60        Ok(serde_json::json!({
61            "status": "completed",
62            "filename": filename,
63            "verification": verification.map(|f| f.to_json()),
64            "metadata": metadata,
65        }))
66    }
67}
68
69/// Quick verification function for immediate file existence check
70pub async fn quick_verify(workspace_root: PathBuf, filename: &str) -> Result<String> {
71    let helper = GenerationHelper::new(workspace_root);
72    helper.verify_and_report(filename).await
73}
74
75#[cfg(test)]
76mod tests {
77    use super::*;
78    use tempfile::TempDir;
79
80    #[tokio::test]
81    async fn test_verification_message() {
82        let temp_dir = TempDir::new().unwrap();
83        let helper = GenerationHelper::new(temp_dir.path().to_path_buf());
84
85        // Test non-existent file
86        let result = helper.verify_and_report("test.pdf").await.unwrap();
87        assert!(result.contains("⚠ File not found"));
88    }
89
90    #[tokio::test]
91    async fn test_create_verified_response() {
92        let temp_dir = TempDir::new().unwrap();
93        let helper = GenerationHelper::new(temp_dir.path().to_path_buf());
94
95        let response = helper
96            .create_verified_response("test.pdf", Some("Additional info"))
97            .await
98            .unwrap();
99
100        assert!(response.contains("Additional info"));
101        assert!(response.contains("⚠ File not found"));
102    }
103}