/
arch_linux
/
rcm
Обзор
Документация
Войти
/
arch_linux
/
rcm
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/cli.rs
173 строки
6 KB
БАЛИЦКИЙ АЛЕКСАНДР НИКОЛАЕВИЧ
upload files
26 ноя 2025, 10:22
26 ноя 2025, 10:22
35fe12c
Код
Авторство
О чём код?
use crate::interactive; use clap::Parser; use std::path::PathBuf; use std::env; #[derive(Parser)] pub struct CliArgs { #[command(subcommand)] pub command: Option<CliCommands>, #[arg(short, long)] pub interactive: bool, #[arg(long)] pub project_dir: Option<String>, } // ДОБАВЛЯЕМ ЭТОТ БЛОК - он был потерян! #[derive(clap::Subcommand)] pub enum CliCommands { Build { #[arg(short, long)] release: bool, }, Run, Check, Clean, Test, Doc { #[arg(long)] open: bool, }, Add { crate_name: String, }, Remove { crate_name: String, }, Update, Publish, Install { crate_name: String, }, Fmt, Clippy, } pub fn run_cli(args: CliArgs) { if args.interactive { interactive::run_interactive_mode(); return; } // Устанавливаем рабочую директорию если указана if let Some(dir) = args.project_dir { if let Err(e) = env::set_current_dir(&dir) { eprintln!("❌ Не удалось перейти в директорию {}: {}", dir, e); return; } } match args.command { Some(CliCommands::Build { release }) => { let cmd = if release { "cargo build --release" } else { "cargo build" }; execute_command_in_project(cmd); }, Some(CliCommands::Run) => execute_command_in_project("cargo run"), Some(CliCommands::Check) => execute_command_in_project("cargo check"), Some(CliCommands::Clean) => execute_command_in_project("cargo clean"), Some(CliCommands::Test) => execute_command_in_project("cargo test"), Some(CliCommands::Doc { open }) => { let cmd = if open { "cargo doc --open" } else { "cargo doc" }; execute_command_in_project(cmd); }, Some(CliCommands::Add { crate_name }) => { execute_command_in_project(&format!("cargo add {}", crate_name)); }, Some(CliCommands::Remove { crate_name }) => { execute_command_in_project(&format!("cargo remove {}", crate_name)); }, Some(CliCommands::Update) => execute_command_in_project("cargo update"), Some(CliCommands::Publish) => execute_command_in_project("cargo publish --dry-run"), Some(CliCommands::Install { crate_name }) => { execute_command(&format!("cargo install {}", crate_name)); // install глобальный }, Some(CliCommands::Fmt) => execute_command_in_project("cargo fmt"), Some(CliCommands::Clippy) => execute_command_in_project("cargo clippy"), None => println!("Используйте --help для списка команд или --interactive для интерактивного режима"), } } fn execute_command_in_project(cmd: &str) { // Ищем корень Cargo проекта if let Some(project_root) = find_cargo_project_root() { println!("📁 Рабочая директория: {}", project_root.display()); execute_command_in_dir(cmd, &project_root); } else { eprintln!("❌ Не найден Cargo.toml в текущей директории или родительских"); eprintln!("💡 Используйте --project-dir для указания пути к проекту"); eprintln!("💡 Или запустите в директории с Cargo.toml"); } } fn execute_command(cmd: &str) { println!("🚀 Выполняется: {}", cmd); let output = std::process::Command::new("sh") .arg("-c") .arg(cmd) .output(); match output { Ok(output) => { if output.status.success() { println!("✅ Команда выполнена успешно"); if !output.stdout.is_empty() { println!("📋 Вывод:\n{}", String::from_utf8_lossy(&output.stdout)); } } else { println!("❌ Команда завершилась с ошибкой"); if !output.stderr.is_empty() { eprintln!("💥 Ошибка:\n{}", String::from_utf8_lossy(&output.stderr)); } } }, Err(e) => { eprintln!("❌ Ошибка выполнения команды: {}", e); } } } fn execute_command_in_dir(cmd: &str, dir: &std::path::Path) { println!("🚀 Выполняется: {} в {}", cmd, dir.display()); let output = std::process::Command::new("sh") .arg("-c") .arg(cmd) .current_dir(dir) .output(); match output { Ok(output) => { if output.status.success() { println!("✅ Команда выполнена успешно"); if !output.stdout.is_empty() { println!("📋 Вывод:\n{}", String::from_utf8_lossy(&output.stdout)); } } else { println!("❌ Команда завершилась с ошибкой"); if !output.stderr.is_empty() { eprintln!("💥 Ошибка:\n{}", String::from_utf8_lossy(&output.stderr)); } } }, Err(e) => { eprintln!("❌ Ошибка выполнения команды: {}", e); } } } fn find_cargo_project_root() -> Option<PathBuf> { let current_dir = env::current_dir().ok()?; let mut dir = current_dir.as_path(); // Поднимаемся вверх по директориям пока не найдем Cargo.toml while dir.parent().is_some() { let cargo_toml = dir.join("Cargo.toml"); if cargo_toml.exists() { return Some(dir.to_path_buf()); } dir = dir.parent()?; } None }