rsplug-walker 0.2.3

High-performance async directory walker with adaptive concurrency
Documentation
use std::env;
use walker::compiled_glob::CompiledGlob;
use walker::walker::{EntryKind, Walker};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let patterns: Vec<String> = env::args().skip(1).collect();
    if patterns.is_empty() {
        eprintln!("Usage: cargo run -- '<glob pattern>' ['<glob pattern>' ...]");
        eprintln!("Example: cargo run -- '**/*.rs' 'src/**'");
        return Ok(());
    }

    let mut compiled = Vec::new();
    for pattern in &patterns {
        match CompiledGlob::new(pattern) {
            Ok(c) => compiled.push(c),
            Err(err) => {
                eprintln!("invalid pattern `{pattern}`: {err}");
                continue;
            }
        };
    }

    let merged = match CompiledGlob::merge_many(compiled) {
        Ok(merged) => merged,
        Err(err) => {
            eprintln!("no valid patterns to run: {err}");
            return Ok(());
        }
    };

    println!("# merged patterns:");
    for pattern in &patterns {
        println!("#   {pattern}");
    }

    let mut rx = Walker::spawn(merged);
    while let Some(msg) = rx.recv().await {
        match msg {
            Ok(event) => {
                let kind = match event.kind {
                    EntryKind::File => "file",
                    EntryKind::Dir => "dir",
                    EntryKind::Symlink => "symlink",
                    EntryKind::Other => "other",
                };
                println!("{kind}\t{}", event.path.display());
            }
            Err(err) => {
                eprintln!("walk error: {err}");
            }
        }
    }

    Ok(())
}