tree-fs 0.3.1

Provides a convenient way to create a tree of files
Documentation
use std::fs;
use tree_fs::{Settings, TreeBuilder};

fn main() {
    println!("--- Comprehensive TreeBuilder Example ---");

    // 1. Default behavior: creates in a temporary directory, auto-drops
    let default_tree = TreeBuilder::default()
        .add_file("default_file.txt", "Content in default temp dir")
        .create()
        .expect("Failed to create default tree");
    println!("Default tree created in: {}", default_tree.root.display());
    let default_path = default_tree.root.clone();
    assert!(default_path.exists());
    drop(default_tree);
    assert!(
        !default_path.exists(),
        "Default tree should be auto-deleted."
    );
    println!("Default tree auto-deleted successfully.");

    // 2. Custom root, various file types, and settings
    let custom_root_path = std::env::temp_dir().join("tree_fs_custom_example");
    // Clean up previous run if any, for idempotency of example
    if custom_root_path.exists() {
        let _ = fs::remove_dir_all(&custom_root_path);
    }

    let complex_tree = TreeBuilder::default()
        .root_folder(&custom_root_path) // Custom root
        .add_file("project/README.md", "# My Project")
        .add_empty_file("project/.gitignore")
        .add_directory("project/src")
        .add_file("project/src/main.rs", "fn main() { println!(\"Hello!\"); }")
        .add_directory("project/config")
        .add_file_with_settings(
            "project/config/prod.json",
            "{ \"api_key\": \"prod_secret\" }",
            Settings::new().readonly(true), // Read-only setting
        )
        .add_readonly_file("project/config/default.json", "{ \"timeout\": 5000 }")
        .override_file(true) // Allow overwriting if files exist (e.g. from previous run if not cleaned)
        .drop(false) // Do not auto-delete this tree
        .create()
        .expect("Failed to create complex tree");

    println!("Complex tree created at: {}", complex_tree.root.display());
    println!("  (This tree will NOT be auto-deleted)");

    // Verify read-only status
    let readonly_config_path = complex_tree.root.join("project/config/prod.json");
    match fs::metadata(&readonly_config_path) {
        Ok(metadata) => {
            assert!(
                metadata.permissions().readonly(),
                "prod.json should be read-only"
            );
            println!("Verified: {} is read-only.", readonly_config_path.display());
        }
        Err(e) => eprintln!(
            "Could not get metadata for {}: {}",
            readonly_config_path.display(),
            e
        ),
    }

    // Verify another readonly file
    let default_config_path = complex_tree.root.join("project/config/default.json");
    match fs::metadata(&default_config_path) {
        Ok(metadata) => {
            assert!(
                metadata.permissions().readonly(),
                "default.json should be read-only"
            );
            println!("Verified: {} is read-only.", default_config_path.display());
        }
        Err(e) => eprintln!(
            "Could not get metadata for {}: {}",
            default_config_path.display(),
            e
        ),
    }

    println!(
        "Example finished. To clean up, manually delete: {}",
        custom_root_path.display()
    );
}