mc-snap 0.6.0

Declarative Minecraft server management. Pin Minecraft, loader, mods, Java, and configs in one YAML file; resolve, install, run, and ship a reproducible bundle.
Documentation
use crate::compat;
use crate::lock::Lock;
use crate::paths::ProjectLayout;
use crate::yml::Snap;
use anyhow::Result;

pub async fn run() -> Result<()> {
    let layout = ProjectLayout::discover(&std::env::current_dir()?)?;
    let snap = Snap::from_path(&layout.yml())?;
    if !layout.lock().is_file() {
        anyhow::bail!("no mc-snap.lock; run `mc-snap install` first");
    }
    let lock = Lock::from_path(&layout.lock())?;

    let reports = compat::find_newer_versions(&snap, &lock).await?;
    if reports.is_empty() {
        println!("no registry mods to check");
        return Ok(());
    }

    println!(
        "newer mod versions available for minecraft {}:",
        snap.server.minecraft
    );
    let mut any = false;
    for r in &reports {
        if r.newer.is_empty() {
            println!("  up-to-date  {:<32} {}", r.mod_id, r.current_version);
        } else {
            any = true;
            let preview = r
                .newer
                .iter()
                .take(3)
                .cloned()
                .collect::<Vec<_>>()
                .join(", ");
            let extra = if r.newer.len() > 3 {
                format!(" (+{} more)", r.newer.len() - 3)
            } else {
                String::new()
            };
            println!(
                "  newer       {:<32} {} -> {}{}",
                r.mod_id, r.current_version, preview, extra
            );
        }
    }
    if any {
        println!("\nedit mc-snap.yml to pin a newer version, then `mc-snap install`.");
    }
    Ok(())
}