mihomo-rs 2.0.0

A Rust SDK and CLI tool for mihomo proxy management with service lifecycle management, configuration handling, and real-time monitoring
Documentation
use crate::cli::{print_info, print_success};
use crate::config::ConfigManager;
use crate::service::{ServiceManager, ServiceStatus};
use crate::version::VersionManager;

pub async fn handle_start() -> anyhow::Result<()> {
    let vm = VersionManager::new()?;
    let cm = ConfigManager::new()?;

    cm.ensure_default_config().await?;
    let controller_url = cm.ensure_external_controller().await?;
    log::info!("External controller configured at: {}", controller_url);

    let binary = vm.get_binary_path(None).await?;
    let config = cm.get_current_path().await?;
    let sm = ServiceManager::new(binary, config);
    sm.start().await?;
    print_success("Service started");

    Ok(())
}

pub async fn handle_stop() -> anyhow::Result<()> {
    let vm = VersionManager::new()?;
    let cm = ConfigManager::new()?;
    let binary = vm.get_binary_path(None).await?;
    let config = cm.get_current_path().await?;
    let sm = ServiceManager::new(binary, config);
    sm.stop().await?;
    print_success("Service stopped");
    Ok(())
}

pub async fn handle_restart() -> anyhow::Result<()> {
    let vm = VersionManager::new()?;
    let cm = ConfigManager::new()?;
    let binary = vm.get_binary_path(None).await?;
    let config = cm.get_current_path().await?;
    let sm = ServiceManager::new(binary, config);

    if sm.is_running().await {
        sm.stop().await?;
    }

    cm.ensure_default_config().await?;
    let controller_url = cm.ensure_external_controller().await?;
    log::info!("External controller configured at: {}", controller_url);

    sm.start().await?;
    print_success("Service restarted");
    Ok(())
}

pub async fn handle_status() -> anyhow::Result<()> {
    let vm = VersionManager::new()?;
    let cm = ConfigManager::new()?;
    let binary = vm.get_binary_path(None).await?;
    let config = cm.get_current_path().await?;
    let sm = ServiceManager::new(binary, config);
    match sm.status().await? {
        ServiceStatus::Running(pid) => {
            print_success(&format!("Service is running (PID: {})", pid));
        }
        ServiceStatus::Stopped => {
            print_info("Service is stopped");
        }
    }
    Ok(())
}