ruvector-scipix 2.0.4

Rust OCR engine for scientific documents - extract LaTeX, MathML from math equations, research papers, and technical diagrams with ONNX GPU acceleration
Documentation
use anyhow::Result;
use clap::Parser;
use ruvector_scipix::cli::{Cli, Commands};
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};

#[tokio::main]
async fn main() -> Result<()> {
    let cli = Cli::parse();

    // Initialize logging based on verbosity
    let log_level = if cli.quiet {
        tracing::Level::ERROR
    } else if cli.verbose {
        tracing::Level::DEBUG
    } else {
        tracing::Level::INFO
    };

    tracing_subscriber::registry()
        .with(
            tracing_subscriber::EnvFilter::try_from_default_env()
                .unwrap_or_else(|_| format!("{}={}", env!("CARGO_PKG_NAME"), log_level).into()),
        )
        .with(tracing_subscriber::fmt::layer())
        .init();

    // Execute the command
    match &cli.command {
        Commands::Ocr(args) => {
            ruvector_scipix::cli::commands::ocr::execute(args.clone(), &cli).await?;
        }
        Commands::Batch(args) => {
            ruvector_scipix::cli::commands::batch::execute(args.clone(), &cli).await?;
        }
        Commands::Serve(args) => {
            ruvector_scipix::cli::commands::serve::execute(args.clone(), &cli).await?;
        }
        Commands::Mcp(args) => {
            ruvector_scipix::cli::commands::mcp::run(args.clone()).await?;
        }
        Commands::Config(args) => {
            ruvector_scipix::cli::commands::config::execute(args.clone(), &cli).await?;
        }
        Commands::Doctor(args) => {
            ruvector_scipix::cli::commands::doctor::execute(args.clone()).await?;
        }
        Commands::Version => {
            println!("scipix-cli v{}", env!("CARGO_PKG_VERSION"));
            println!("A Rust-based CLI for Scipix OCR processing");
        }
        Commands::Completions { shell } => {
            use clap::CommandFactory;
            use clap_complete::{generate, Shell};

            let shell = shell
                .clone()
                .unwrap_or_else(|| Shell::from_env().unwrap_or(Shell::Bash));

            let mut cmd = Cli::command();
            let bin_name = cmd.get_name().to_string();
            generate(shell, &mut cmd, bin_name, &mut std::io::stdout());
        }
    }

    Ok(())
}