freneng 0.1.2

A useful, async-first file renaming library
Documentation
// Quick test to verify the validation bug is fixed
use freneng::RenamingEngine;
use std::path::PathBuf;

#[tokio::main]
async fn main() {
    let engine = RenamingEngine;
    
    // Get files from frentui directory
    let frentui_dir = PathBuf::from("/home/byezy/development/RustroverProjects/fren/frentui");
    let files = vec![
        frentui_dir.join("Cargo.toml"),
        frentui_dir.join("README.md"),
        frentui_dir.join(".gitignore"),
        frentui_dir.join("Cargo.lock"),
        frentui_dir.join("FIXES_SUMMARY.md"),
    ];
    
    // Filter to only existing files
    let existing_files: Vec<_> = files.iter()
        .filter(|f| f.exists())
        .cloned()
        .collect();
    
    println!("Testing validation on {} files from frentui directory:", existing_files.len());
    for file in &existing_files {
        println!("  - {}", file.display());
    }
    println!();
    
    // Generate preview (no rename, just keep names)
    let preview = match engine.generate_preview(&existing_files, "%N.%E").await {
        Ok(p) => p,
        Err(e) => {
            eprintln!("Error generating preview: {}", e);
            return;
        }
    };
    
    println!("Generated {} renames", preview.renames.len());
    println!();
    
    // Validate
    let validation = engine.validate(&preview.renames, false).await;
    
    println!("Validation Results:");
    println!("  Valid: {}", validation.valid.len());
    println!("  Issues: {}", validation.issues.len());
    println!();
    
    if !validation.issues.is_empty() {
        println!("Issues found:");
        for (path, issue) in &validation.issues {
            println!("  {}: {:?}", path.display(), issue);
        }
    } else {
        println!("✓ All files validated successfully - no ParentNotWritable errors!");
    }
    
    // Check specifically for ParentNotWritable
    let parent_not_writable_count = validation.issues.iter()
        .filter(|(_, issue)| matches!(issue, freneng::ValidationIssue::ParentNotWritable(_)))
        .count();
    
    if parent_not_writable_count > 0 {
        println!();
        println!("❌ BUG STILL EXISTS: Found {} ParentNotWritable errors", parent_not_writable_count);
        for (path, issue) in &validation.issues {
            if matches!(issue, freneng::ValidationIssue::ParentNotWritable(_)) {
                println!("  {}: {:?}", path.display(), issue);
            }
        }
    } else {
        println!();
        println!("✓ BUG FIXED: No ParentNotWritable errors found");
    }
}