use std::process::Command;
use std::env;
pub fn run_doctor() -> Result<(), Box<dyn std::error::Error>> {
println!("đĨ Oxidite Health Check\n");
let mut all_ok = true;
print!("Checking Rust installation... ");
match Command::new("rustc").arg("--version").output() {
Ok(output) => {
let version = String::from_utf8_lossy(&output.stdout);
println!("â
{}", version.trim());
}
Err(_) => {
println!("â Rust not found");
all_ok = false;
}
}
print!("Checking Cargo... ");
match Command::new("cargo").arg("--version").output() {
Ok(output) => {
let version = String::from_utf8_lossy(&output.stdout);
println!("â
{}", version.trim());
}
Err(_) => {
println!("â Cargo not found");
all_ok = false;
}
}
print!("Checking project structure... ");
if std::path::Path::new("Cargo.toml").exists() {
println!("â
Cargo.toml found");
} else {
println!("â ī¸ Not in a Cargo project directory");
}
print!("Checking configuration... ");
if std::path::Path::new("oxidite.toml").exists() {
println!("â
oxidite.toml found");
} else if std::path::Path::new("config.toml").exists() {
println!("â
config.toml found");
} else {
println!("â ī¸ No configuration file found (optional)");
}
print!("Checking migrations... ");
if std::path::Path::new("migrations").exists() {
let count = std::fs::read_dir("migrations")?.count();
println!("â
Found {} migration(s)", count);
} else {
println!("âšī¸ No migrations directory");
}
println!("\nChecking environment variables:");
check_env_var("DATABASE_URL");
check_env_var("REDIS_URL");
check_env_var("JWT_SECRET");
println!();
if all_ok {
println!("â
All critical checks passed!");
} else {
println!("â ī¸ Some checks failed. See above for details.");
}
Ok(())
}
fn check_env_var(name: &str) {
print!(" {}: ", name);
match env::var(name) {
Ok(value) => {
let masked = if name.contains("SECRET") || name.contains("PASSWORD") {
"***"
} else if value.len() > 30 {
&format!("{}...", &value[..27])
} else {
&value
};
println!("â
{}", masked);
}
Err(_) => println!("â ī¸ Not set"),
}
}