use anyhow::{Context, Result};
use std::process::Command;
use colored::*;
pub struct Captain;
impl Captain {
pub fn run_command(args: &[&str]) -> Result<()> {
println!(
"🚢 {}", "Running captain command requires advanced binary".bright_blue()
);
println!(" Delegating to real captain implementation...");
Self::delegate_to_captain(args.to_vec())
}
pub fn get_status() -> Result<()> {
println!("🚢 {}", "Captain status requires advanced binary".bright_blue());
Self::delegate_to_captain(vec!["status"])
}
pub fn show_version() -> Result<()> {
println!(
"🚢 {}", "Version information requires advanced binary".bright_blue()
);
Self::delegate_to_captain(vec!["version"])
}
pub fn show_help() -> Result<()> {
println!("🚢 {}", "Help information requires advanced binary".bright_blue());
Self::delegate_to_captain(vec!["help"])
}
pub fn initialize() -> Result<()> {
println!(
"🚢 {}", "Captain initialization requires advanced binary".bright_blue()
);
Self::delegate_to_captain(vec!["init"])
}
pub fn self_update() -> Result<()> {
println!("🚢 {}", "Self-update requires advanced binary".bright_blue());
Self::delegate_to_captain(vec!["update"])
}
fn delegate_to_captain(args: Vec<&str>) -> Result<()> {
let captain_path = match crate::captain::captain_status::find_captain_binary() {
Some(path) => path,
None => {
println!("❌ {}", "Advanced captain binary not found".red().bold());
println!(
"🔄 {}", "Auto-downloading captain binary from get.cargo.do/"
.cyan()
);
match crate::captain::captain_status::auto_download_captain() {
Ok(path) => path,
Err(e) => {
println!(
"❌ {}", format!("Failed to download captain: {}", e) .red()
);
println!("💡 {}", "Please run: cm captain install".cyan());
println!(" Or upgrade at: https://cargo.do/pro");
println!();
println!(
"💡 {}", "Captain features require the advanced binary:"
.cyan()
);
println!(" • Command execution and processing");
println!(" • Status monitoring and reporting");
println!(" • Version management and updates");
println!(" • Advanced initialization");
return Ok(());
}
}
}
};
let output = Command::new(&captain_path)
.args(&args)
.output()
.context("Failed to execute captain binary")?;
if !output.stdout.is_empty() {
print!("{}", String::from_utf8_lossy(& output.stdout));
}
if !output.stderr.is_empty() {
eprint!("{}", String::from_utf8_lossy(& output.stderr));
}
if !output.status.success() {
println!(
"❌ {}", format!("Captain binary exited with status: {}", output.status)
.red()
);
}
Ok(())
}
}
pub fn execute_captain_command(command: &str, args: &[&str]) -> Result<()> {
println!(
"🚢 {}", format!("Executing '{}' requires advanced binary", command)
.bright_blue()
);
Captain::run_command(args)
}
pub fn get_captain_info() -> Result<String> {
println!("🚢 {}", "Captain information requires advanced binary".bright_blue());
Captain::delegate_to_captain(vec!["info"])
.map(|_| "Advanced captain information available".to_string())
}