/
arch_linux
/
rcm
Обзор
Документация
Войти
/
arch_linux
/
rcm
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main.rs
228 строк
7 KB
БАЛИЦКИЙ АЛЕКСАНДР НИКОЛАЕВИЧ
upload files
26 ноя 2025, 10:22
26 ноя 2025, 10:22
35fe12c
Код
Авторство
О чём код?
use clap::Parser; // Объявляем все модули mod cli; mod gui; mod config; mod interactive; #[derive(Parser)] #[command(name = "cargo-ui-manager")] #[command(about = "Универсальный интерфейс для Cargo команд")] struct Args { /// Запустить настройки #[arg(long)] settings: bool, #[command(subcommand)] mode: Option<Mode>, } #[derive(clap::Subcommand)] enum Mode { /// Запуск CLI версии Cli(cli::CliArgs), /// Запуск GUI версии Gui, } fn main() { let args = Args::parse(); let config = config::AppConfig::load(); if args.settings { run_settings(); return; } match args.mode { Some(Mode::Cli(cli_args)) => cli::run_cli(cli_args), Some(Mode::Gui) => gui::run_gui(), None => { // Проверяем, запущено ли в интерактивном терминале if atty::isnt(atty::Stream::Stdin) { println!("🚀 Cargo UI Manager"); println!("💡 Для интерактивного режима запустите в терминале"); println!("👨💻 Использование:"); println!(" cargo-ui-manager cli --interactive"); println!(" cargo-ui-manager gui"); return; } run_start_menu(&config); } } } fn run_start_menu(config: &config::AppConfig) { println!("🚀 Cargo UI Manager - Стартовое меню"); println!("────────────────────────────────────"); let choices = vec![ "1. 📟 CLI режим (интерактивный)", "2. 🖥️ GUI режим (графический)", "3. ⚙️ Настройки", "4. ❌ Выход" ]; let selection = dialoguer::Select::new() .with_prompt("Выберите режим запуска") .items(&choices) .default(match config.default_mode { config::Mode::Cli => 0, config::Mode::Gui => 1, }) .interact(); match selection { Ok(0) => { let cli_args = cli::CliArgs { command: None, interactive: config.cli_settings.default_interactive, project_dir: None, }; cli::run_cli(cli_args); } Ok(1) => gui::run_gui(), Ok(2) => run_settings(), Ok(3) => { println!("👋 До свидания!"); } Err(e) => { eprintln!("❌ Ошибка ввода: {}", e); println!("💡 Попробуйте запустить с явными аргументами:"); println!(" cargo-ui-manager cli --interactive"); println!(" cargo-ui-manager gui"); } _ => {} } } fn run_settings() { println!("⚙️ Настройки Cargo UI Manager"); println!("─────────────────────────────"); let config = config::AppConfig::load(); loop { let choices = vec![ "📱 Режим по умолчанию", "📟 Настройки CLI", "🖥️ Настройки GUI", "💾 Сохранить и выйти", "🚪 Выйти без сохранения" ]; let selection = dialoguer::Select::new() .with_prompt("Выберите настройку") .items(&choices) .interact(); match selection { Ok(0) => change_default_mode(), Ok(1) => change_cli_settings(), Ok(2) => change_gui_settings(), Ok(3) => { let _ = config::AppConfig::load().save(); println!("✅ Настройки сохранены!"); break; } Ok(4) => { println!("🚪 Выход без сохранения"); break; } Err(e) => { eprintln!("❌ Ошибка ввода: {}", e); break; } _ => {} } } } fn change_default_mode() { let choices = vec!["📟 CLI режим", "🖥️ GUI режим"]; let selection = dialoguer::Select::new() .with_prompt("Выберите режим по умолчанию") .items(&choices) .interact(); match selection { Ok(0) => { let mut config = config::AppConfig::load(); config.default_mode = config::Mode::Cli; let _ = config.save(); println!("✅ Режим по умолчанию изменен!"); } Ok(1) => { let mut config = config::AppConfig::load(); config.default_mode = config::Mode::Gui; let _ = config.save(); println!("✅ Режим по умолчанию изменен!"); } Err(e) => { eprintln!("❌ Ошибка ввода: {}", e); } _ => {} } } fn change_cli_settings() { let mut config = config::AppConfig::load(); let interactive = dialoguer::Confirm::new() .with_prompt("Запускать CLI в интерактивном режиме по умолчанию?") .default(config.cli_settings.default_interactive) .interact(); let verbose = dialoguer::Confirm::new() .with_prompt("Включить подробный вывод (verbose)?") .default(config.cli_settings.verbose) .interact(); match (interactive, verbose) { (Ok(interactive), Ok(verbose)) => { config.cli_settings.default_interactive = interactive; config.cli_settings.verbose = verbose; let _ = config.save(); println!("✅ Настройки CLI обновлены!"); } _ => { eprintln!("❌ Ошибка ввода настроек"); } } } fn change_gui_settings() { let mut config = config::AppConfig::load(); let themes = vec!["dark", "light", "blue"]; let theme_selection = dialoguer::Select::new() .with_prompt("Выберите тему") .items(&themes) .default(themes.iter().position(|t| *t == config.gui_settings.theme).unwrap_or(0)) .interact(); let width: Result<f32, _> = dialoguer::Input::new() .with_prompt("Ширина окна") .default(config.gui_settings.window_width) .interact_text(); let height: Result<f32, _> = dialoguer::Input::new() .with_prompt("Высота окна") .default(config.gui_settings.window_height) .interact_text(); match (theme_selection, width, height) { (Ok(theme_selection), Ok(width), Ok(height)) => { config.gui_settings.theme = themes[theme_selection].to_string(); config.gui_settings.window_width = width; config.gui_settings.window_height = height; let _ = config.save(); println!("✅ Настройки GUI обновлены!"); } _ => { eprintln!("❌ Ошибка ввода настроек"); } } }