x402-cli 1.1.1

A comprehensive developer CLI for project scaffolding, wallet management, and payment testing.
Documentation
use anyhow::{Context, Result};
use colored::Colorize;
use std::process::Command;

pub async fn deploy(provider: &str) -> Result<()> {
    match provider.to_lowercase().as_str() {
        "vercel" | "vercel.app" => deploy_to_vercel().await,
        _ => {
            println!(
                "{}",
                format!("  ⚠ Provider '{}' not yet supported", provider)
                    .yellow()
                    .dimmed()
            );
            println!("{}", "  Supported providers: vercel".dimmed());
            Ok(())
        }
    }
}

async fn deploy_to_vercel() -> Result<()> {
    println!("{}", "  Step 1: Building facilitator...".dimmed());

    let build_result = Command::new("cargo")
        .args(["build", "--release"])
        .output()
        .context("Failed to build project")?;

    if !build_result.status.success() {
        let error = String::from_utf8_lossy(&build_result.stderr);
        anyhow::bail!("Build failed: {}", error);
    }

    println!("{}", "  ✓ Build successful".green().dimmed());

    println!(
        "{}",
        "  Step 2: Checking for vercel installation...".dimmed()
    );

    let check_result = Command::new("vercel").arg("--version").output();

    match check_result {
        Ok(output) if output.status.success() => {
            println!("{}", "  ✓ Vercel CLI installed".green().dimmed());
        }
        _ => {
            println!(
                "{}",
                "  ℹ Vercel CLI not found. Installing...".yellow().dimmed()
            );
            println!("{}", "  Run: npm install -g vercel".dimmed());
            return Ok(());
        }
    }

    println!("{}", "  Step 3: Deploying facilitator...".dimmed());

    let deploy_result = Command::new("vercel")
        .args(["--prod"])
        .output()
        .context("Failed to execute vercel deploy")?;

    let _output = String::from_utf8_lossy(&deploy_result.stdout);

    if deploy_result.status.success() {
        println!("{}", "  ✓ Deployment initiated".green().dimmed());
        println!(
            "{}",
            "  Check Vercel dashboard for deployment status".dimmed()
        );
        println!("{}", "  Typically: https://vercel.com/dashboard".dimmed());
    } else {
        let error = String::from_utf8_lossy(&deploy_result.stderr);
        println!(
            "{}",
            format!("  ⚠ Deployment may have failed: {}", error)
                .yellow()
                .dimmed()
        );
    }

    println!();
    println!("{}", "Deployment Summary".cyan().bold());
    println!(
        "{}",
        "  Follow the Vercel CLI prompts to complete deployment".dimmed()
    );
    println!(
        "{}",
        "  Your facilitator will be deployed with a public URL".dimmed()
    );

    Ok(())
}