fs_usage_sys 0.1.4

A Rust wrapper for macOS fs_usage to monitor file system events with advanced filtering
Documentation
use anyhow::Result;
use fs_usage_sys::FsUsageMonitorBuilder;
use std::env;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use std::time::Duration;

fn main() -> Result<()> {
    // Enable debug logging for fs_usage_sys
    std::env::set_var("RUST_LOG", "fs_usage_sys=debug");
    tracing_subscriber::fmt::init();

    let args: Vec<String> = env::args().collect();

    let mut builder = FsUsageMonitorBuilder::new();

    if args.len() > 1 {
        for path in &args[1..] {
            println!("Watching path: {}", path);
            builder = builder.watch_path(path);
        }
    } else {
        println!("Monitoring ALL file system events (no path filter)");
        println!("This will show a lot of activity!");
    }

    let mut monitor = builder.build()?;

    println!("Starting file system monitor (debug mode)...");
    println!("This will show raw fs_usage output parsing");
    monitor.start()?;

    let running = Arc::new(AtomicBool::new(true));
    let r = running.clone();

    ctrlc::set_handler(move || {
        println!("\nStopping monitor...");
        r.store(false, Ordering::SeqCst);
    })?;

    let mut event_count = 0;
    while running.load(Ordering::SeqCst) && event_count < 100 {
        match monitor.events().recv_timeout(Duration::from_millis(100)) {
            Ok(event) => {
                event_count += 1;
                println!("\n=== Event #{} ===", event_count);
                println!("Timestamp: {}", event.timestamp);
                println!("Operation: {}", event.operation);
                println!("Process: {} (PID: {})", event.process_name, event.pid);
                println!("Path: {}", event.path);
                println!("Result: {}", event.result);
            }
            Err(crossbeam_channel::RecvTimeoutError::Timeout) => {
                continue;
            }
            Err(e) => {
                eprintln!("Error receiving event: {}", e);
                break;
            }
        }
    }

    monitor.stop()?;
    println!("\nMonitor stopped after {} events", event_count);

    Ok(())
}