jepa 0.1.0

CLI and TUI for the jepa-rs workspace
Documentation
use anyhow::Result;

use jepa_compat::registry::{self, ModelFamily};

use crate::cli::{ModelFamilyFilter, ModelsArgs};
use crate::fmt_utils::format_params;

pub fn run(args: ModelsArgs) -> Result<()> {
    let all_models = registry::list_models();

    let models: Vec<_> = match &args.family {
        Some(ModelFamilyFilter::Ijepa) => all_models
            .into_iter()
            .filter(|m| matches!(m.family, ModelFamily::IJepa))
            .collect(),
        Some(ModelFamilyFilter::Vjepa) => all_models
            .into_iter()
            .filter(|m| matches!(m.family, ModelFamily::VJepa))
            .collect(),
        None => all_models,
    };

    if let Some(ref query) = args.name {
        match registry::find_model(query) {
            Some(m) => {
                println!("┌─────────────────────────────────────────────┐");
                println!("│  Model: {:<35} │", m.name);
                println!("├─────────────────────────────────────────────┤");
                println!("│  Family:       {:<28} │", format!("{:?}", m.family));
                println!("│  Architecture: {:<28} │", m.architecture);
                println!(
                    "│  Parameters:   {:<28} │",
                    format_params(m.num_params as usize)
                );
                println!(
                    "│  Format:       {:<28} │",
                    format!("{:?}", m.checkpoint_format)
                );
                println!("└─────────────────────────────────────────────┘");
            }
            None => {
                eprintln!("No model found matching '{query}'");
                std::process::exit(1);
            }
        }
        return Ok(());
    }

    println!();
    println!("  ╔══════════════════════════════════════════════════════════════════╗");
    println!("  ║                    JEPA Pretrained Models                       ║");
    println!("  ╠══════════════════════════════════════════════════════════════════╣");
    println!(
        "  ║ {:<18} {:<10} {:<16} {:<16} ║",
        "Name", "Family", "Architecture", "Params"
    );
    println!("  ╠══════════════════════════════════════════════════════════════════╣");

    for m in &models {
        println!(
            "  ║ {:<18} {:<10} {:<16} {:<16} ║",
            m.name,
            format!("{:?}", m.family),
            m.architecture,
            format_params(m.num_params as usize),
        );
    }

    println!("  ╚══════════════════════════════════════════════════════════════════╝");
    println!();
    println!(
        "  {} model(s) found. Use --name <query> for details.",
        models.len()
    );
    println!();

    Ok(())
}