diff --git a/CHANGELOG.md b/CHANGELOG.md index 354c680..51c5e86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.2.1] - 2026-02-18 +Changed: +- Translated user-facing CLI messages to English in `clean`, `build`, `flag_update`, and `help` +- Unified error and warning output in `clean`, `build`, and `flag_update` via `utils::log::{error, warn}` +- Updated `--help` output: translated headers and examples to English, used `printc`, and applied `BOLD_*` styles +- Translated installer script messages in `install.sh` and `install.ps1` to English + ## [0.2.0] - 2026-02-17 Изменено: - Проект переведен с Python на Rust diff --git a/Cargo.lock b/Cargo.lock index a60ee7b..49475fd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -62,8 +62,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "dcr" -version = "0.2.0" +version = "0.2.1" dependencies = [ + "log", "reqwest", "self-replace", "serde", diff --git a/Cargo.toml b/Cargo.toml index 0c38d3a..d8eb948 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dcr" -version = "0.2.0" +version = "0.2.1" edition = "2024" build = "build.rs" @@ -8,3 +8,4 @@ build = "build.rs" reqwest = { version = "0.12", default-features = false, features = ["blocking", "json", "rustls-tls"] } serde = { version = "1", features = ["derive"] } self-replace = "1" +log = "0.4.29" \ No newline at end of file diff --git a/install.ps1 b/install.ps1 index 379a52f..2fcb632 100644 --- a/install.ps1 +++ b/install.ps1 @@ -13,27 +13,27 @@ function Fail($msg) { Write-Host "[ERROR] $msg" -ForegroundColor Red; exit 1 } function Require-Cmd($name) { if (-not (Get-Command $name -ErrorAction SilentlyContinue)) { - Fail "Не найдено: $name" + Fail "Not found: $name" } } function Select-Mode { - Write-Host "Выбери способ установки:" - Write-Host " 1) Скачать готовый бинарник из GitHub Release (рекомендуется)" - Write-Host " 2) Собрать из git" - $choice = Read-Host "Введите 1 или 2 [1]" + Write-Host "Choose installation mode:" + Write-Host " 1) Download prebuilt binary from GitHub Release (recommended)" + Write-Host " 2) Build from git" + $choice = Read-Host "Enter 1 or 2 [1]" if ([string]::IsNullOrWhiteSpace($choice)) { $choice = '1' } switch ($choice) { '1' { return 'release' } '2' { return 'build' } - default { Fail 'Неизвестный вариант' } + default { Fail 'Unknown option' } } } function Get-Target { if ($env:PROCESSOR_ARCHITECTURE -ne 'AMD64') { - Fail "Поддерживается только x86_64 Windows, текущая архитектура: $env:PROCESSOR_ARCHITECTURE" + Fail "Only x86_64 Windows is supported, current architecture: $env:PROCESSOR_ARCHITECTURE" } return 'x86_64-pc-windows-msvc' } @@ -44,17 +44,17 @@ function Install-FromRelease { New-Item -ItemType Directory -Path $InstallPath -Force | Out-Null $assetName = "dcr-$target.exe" - Info "Получение последнего релиза..." + Info "Fetching latest release..." $release = Invoke-RestMethod -Method Get -Uri $ApiUrl $asset = $release.assets | Where-Object { $_.name -eq $assetName } | Select-Object -First 1 if (-not $asset) { - Fail "Не найден ассет $assetName в релизе $($release.tag_name)" + Fail "Asset $assetName not found in release $($release.tag_name)" } - Info "Скачивание $assetName..." + Info "Downloading $assetName..." Invoke-WebRequest -Uri $asset.browser_download_url -OutFile $BinaryPath - Ok "Скачан бинарник $assetName" + Ok "Binary downloaded: $assetName" } function Install-FromSource { @@ -66,17 +66,17 @@ function Install-FromSource { $tmp = Join-Path $env:TEMP 'dcr-install' if (Test-Path $tmp) { Remove-Item -Recurse -Force $tmp } - Info 'Клонирование репозитория...' + Info 'Cloning repository...' git clone --depth 1 $RepoUrl $tmp | Out-Null - Info 'Сборка release-бинарника...' + Info 'Building release binary...' Push-Location $tmp cargo build --release --target $target Pop-Location New-Item -ItemType Directory -Path $InstallPath -Force | Out-Null Copy-Item (Join-Path $tmp "target\$target\release\dcr.exe") $BinaryPath -Force - Ok 'Установлен бинарник из исходников' + Ok 'Binary installed from source' Remove-Item -Recurse -Force $tmp } @@ -93,13 +93,13 @@ function Setup-Path { $newPath = if ($userPath) { "$userPath;$BinPath" } else { $BinPath } [Environment]::SetEnvironmentVariable('Path', $newPath, 'User') $env:Path = "$env:Path;$BinPath" - Warn "Добавлен путь в PATH: $BinPath" + Warn "Added path to PATH: $BinPath" } - Ok "Команда dcr доступна через $linkPath" + Ok "dcr command is available via $linkPath" } -Info 'Запуск установки DCR' +Info 'Starting DCR installation' $mode = Select-Mode $target = Get-Target @@ -110,4 +110,4 @@ if ($mode -eq 'build') { } Setup-Path -Ok 'Установка завершена успешно' +Ok 'Installation completed successfully' diff --git a/install.sh b/install.sh index 50a18a6..79a70d2 100755 --- a/install.sh +++ b/install.sh @@ -22,12 +22,12 @@ success() { echo -e "${GREEN}✔ $1${NC}"; } warn() { echo -e "${YELLOW}⚠ $1${NC}"; } error() { echo -e "${RED}✖ $1${NC}"; } -trap 'error "Ошибка на строке $LINENO"; exit 1' ERR +trap 'error "Error on line $LINENO"; exit 1' ERR check_os() { case "$(uname -s)" in Linux|Darwin) ;; - *) error "Поддерживаются только Linux и macOS"; exit 1 ;; + *) error "Only Linux and macOS are supported"; exit 1 ;; esac } @@ -40,32 +40,32 @@ detect_target() { Linux:x86_64) TARGET_TRIPLE="x86_64-unknown-linux-gnu" ;; Darwin:x86_64) TARGET_TRIPLE="x86_64-apple-darwin" ;; Darwin:arm64|Darwin:aarch64) TARGET_TRIPLE="aarch64-apple-darwin" ;; - *) error "Неподдерживаемая платформа: $os/$arch"; exit 1 ;; + *) error "Unsupported platform: $os/$arch"; exit 1 ;; esac ASSET_NAME="dcr-${TARGET_TRIPLE}" } check_common_dependencies() { - command -v curl >/dev/null 2>&1 || { error "curl не установлен"; exit 1; } + command -v curl >/dev/null 2>&1 || { error "curl is not installed"; exit 1; } } check_build_dependencies() { - command -v git >/dev/null 2>&1 || { error "git не установлен"; exit 1; } - command -v cargo >/dev/null 2>&1 || { error "cargo не установлен"; exit 1; } + command -v git >/dev/null 2>&1 || { error "git is not installed"; exit 1; } + command -v cargo >/dev/null 2>&1 || { error "cargo is not installed"; exit 1; } } prepare_sources() { - log "Получение исходников..." + log "Fetching sources..." rm -rf "$TMPDIR" git clone --depth 1 "$REPO_URL" "$TMPDIR" - success "Исходники получены" + success "Sources fetched" } build_binary() { - log "Сборка release-бинарника..." + log "Building release binary..." (cd "$TMPDIR" && cargo build --release) - success "Сборка завершена" + success "Build completed" } fetch_latest_release_json() { @@ -73,47 +73,47 @@ fetch_latest_release_json() { } download_binary() { - log "Получение последнего релиза..." + log "Fetching latest release..." local release_json download_url tag release_json="$(fetch_latest_release_json)" tag="$(printf '%s\n' "$release_json" | sed -n 's/.*"tag_name": "\([^"]*\)".*/\1/p' | head -n1)" if [[ -z "$tag" ]]; then - error "Не удалось определить версию релиза" + error "Failed to determine release version" exit 1 fi download_url="$(printf '%s\n' "$release_json" | sed -n "s#.*\"browser_download_url\": \"\([^\"]*${ASSET_NAME}\)\".*#\1#p" | head -n1)" if [[ -z "$download_url" ]]; then - error "Не найден ассет ${ASSET_NAME} в релизе ${tag}" + error "Asset ${ASSET_NAME} not found in release ${tag}" exit 1 fi mkdir -p "$INSTALL_PATH" curl -fL "$download_url" -o "$INSTALL_PATH/dcr" chmod +x "$INSTALL_PATH/dcr" - success "Скачан бинарник ${ASSET_NAME} (${tag})" + success "Binary ${ASSET_NAME} downloaded (${tag})" } install_built_binary() { mkdir -p "$INSTALL_PATH" cp "$TMPDIR/target/release/dcr" "$INSTALL_PATH/dcr" chmod +x "$INSTALL_PATH/dcr" - success "Установлен бинарник из исходников" + success "Binary installed from source" } install_link() { - log "Создание симлинка..." + log "Creating symlink..." mkdir -p "$BINPATH" ln -sf "$INSTALL_PATH/dcr" "$BINPATH/dcr" - success "Команда 'dcr' добавлена в $BINPATH" + success "Command 'dcr' added to $BINPATH" } check_path() { if ! echo "$PATH" | grep -q "$BINPATH"; then - warn "Каталог $BINPATH не найден в PATH" - echo "Добавь в ~/.bashrc или ~/.zshrc:" + warn "Directory $BINPATH not found in PATH" + echo "Add this to ~/.bashrc or ~/.zshrc:" echo "export PATH=\"$BINPATH:\$PATH\"" fi } @@ -123,20 +123,20 @@ cleanup() { } select_install_mode() { - echo "Выбери способ установки:" - echo " 1) Скачать готовый бинарник из GitHub Release (рекомендуется)" - echo " 2) Собрать из git" - read -r -p "Введите 1 или 2 [1]: " choice + echo "Choose installation mode:" + echo " 1) Download prebuilt binary from GitHub Release (recommended)" + echo " 2) Build from git" + read -r -p "Enter 1 or 2 [1]: " choice case "${choice:-1}" in 1) INSTALL_MODE="release" ;; 2) INSTALL_MODE="build" ;; - *) error "Неизвестный вариант"; exit 1 ;; + *) error "Unknown option"; exit 1 ;; esac } main() { - log "Запуск установки DCR" + log "Starting DCR installation" check_os detect_target @@ -157,8 +157,8 @@ main() { check_path cleanup - success "Установка завершена успешно" - log "Лог сохранён в $LOGFILE" + success "Installation completed successfully" + log "Log saved to $LOGFILE" } main "$@" diff --git a/src/cli/build.rs b/src/cli/build.rs index c284510..be2a08b 100644 --- a/src/cli/build.rs +++ b/src/cli/build.rs @@ -1,14 +1,13 @@ use crate::config::{PROFILE, PROJECT_COMPILER, flags}; use crate::utils::fs::check_dir; -use crate::utils::text::{BOLD, BRIGHT_GREEN, BRIGHT_RED, colored}; +use crate::utils::log::{error, warn}; +use crate::utils::text::{BOLD_GREEN, colored}; use std::fs; use std::process::Command; use std::time::Instant; pub fn build(args: &[String]) -> i32 { let mut active_profile = PROFILE.to_string(); - let red_bold = BRIGHT_RED.to_owned() + BOLD; - let green_bold = BRIGHT_GREEN.to_owned() + BOLD; let project_name = std::env::current_dir() .ok() .and_then(|p| p.file_name().map(|v| v.to_string_lossy().to_string())) @@ -16,7 +15,7 @@ pub fn build(args: &[String]) -> i32 { let items = check_dir(None).unwrap_or_default(); if !items.contains(&"dcr.toml".to_string()) { - println!("{}: не найден файл dcr.toml", colored("error", &red_bold)); + error("dcr.toml file not found"); return 1; } @@ -26,20 +25,20 @@ pub fn build(args: &[String]) -> i32 { if flags(candidate).is_some() { active_profile = candidate.to_string(); } else { - println!("{}: неизвестный флаг сборки", colored("error", &red_bold)); + warn("Unknown build flag"); return 1; } } else { - println!("{}: неизвестный аргумент", colored("error", &red_bold)); + warn("Unknown argument"); return 1; } } println!( - " Сборка проекта `{}`\n Профиль: {}\n Компилятор: {}\n", - colored(&project_name, &green_bold), - colored(&active_profile, &green_bold), - colored(PROJECT_COMPILER, &green_bold) + " Building project `{}`\n Profile: {}\n Compiler: {}\n", + colored(&project_name, BOLD_GREEN), + colored(&active_profile, BOLD_GREEN), + colored(PROJECT_COMPILER, BOLD_GREEN) ); if !items.contains(&"target".to_string()) { @@ -65,14 +64,14 @@ pub fn build(args: &[String]) -> i32 { Ok(status) if status.success() => { let times = ((start_time.elapsed().as_secs_f64() * 100.0).trunc()) / 100.0; println!( - " {} Сборка завершена успешно, за {} секунд", - colored("✔", &green_bold), - colored(×.to_string(), &green_bold) + " {} Build completed successfully in {} seconds", + colored("✔", BOLD_GREEN), + colored(×.to_string(), BOLD_GREEN) ); return 0; } _ => { - println!("{}: сборка не удалась", colored("error", &red_bold)); + error("Build failed"); return 1; } } diff --git a/src/cli/clean.rs b/src/cli/clean.rs index c6c4455..70ddf4a 100644 --- a/src/cli/clean.rs +++ b/src/cli/clean.rs @@ -1,13 +1,10 @@ use crate::config::flags; use crate::utils::fs::check_dir; -use crate::utils::text::{BOLD, BRIGHT_GREEN, BRIGHT_RED, BRIGHT_YELLOW, colored}; +use crate::utils::log::{error, warn}; +use crate::utils::text::{BOLD_GREEN, colored}; use std::fs; pub fn clean(args: &[String]) -> i32 { - let red_bold = BRIGHT_RED.to_owned() + BOLD; - let green_bold = BRIGHT_GREEN.to_owned() + BOLD; - let yellow_bold = BRIGHT_YELLOW.to_owned() + BOLD; - let project_name = std::env::current_dir() .ok() .and_then(|p| p.file_name().map(|v| v.to_string_lossy().to_string())) @@ -15,23 +12,20 @@ pub fn clean(args: &[String]) -> i32 { let items = check_dir(None).unwrap_or_default(); if args.len() > 1 { - println!("{}: неизвестный аргумент", colored("error", &red_bold)); + error("Unknown argument"); return 1; } if !items.contains(&"dcr.toml".to_string()) { - println!("{}: не найден файл dcr.toml", colored("error", &red_bold)); + error("dcr.toml file not found"); return 1; } println!( - " Очистка проекта `{}`", - colored(&project_name, &green_bold) + " Cleaning project `{}`", + colored(&project_name, BOLD_GREEN) ); if !items.contains(&"target".to_string()) { - println!( - "{}: директория target не найдена", - colored("warn", &yellow_bold) - ); + warn("Directory target not found"); return 1; } @@ -41,32 +35,29 @@ pub fn clean(args: &[String]) -> i32 { profile = profile.trim_start_matches("--").to_string(); } if flags(&profile).is_none() { - println!("{}: неизвестный профиль", colored("error", &red_bold)); + error("Unknown profile"); return 1; } let target_items = check_dir(Some("target")).unwrap_or_default(); if !target_items.contains(&profile) { - println!( - "{}: директория target/{profile} не найдена", - colored("warn", &yellow_bold) - ); + warn(&format!("Directory target/{profile} not found")); return 1; } - println!(" Профиль: {}", colored(&profile, &green_bold)); + println!(" Profile: {}", colored(&profile, BOLD_GREEN)); let _ = fs::remove_dir_all(format!("target/{profile}")); println!( - "{} Удалена директория target/{profile}", - colored("\n ✔", &green_bold) + "{} Removed directory target/{profile}", + colored("\n ✔", BOLD_GREEN) ); return 0; } let _ = fs::remove_dir_all("target"); println!( - "{} Удалена директория target", - colored("\n ✔", &green_bold) + "{} Removed directory target", + colored("\n ✔", BOLD_GREEN) ); 0 } diff --git a/src/cli/flag_update.rs b/src/cli/flag_update.rs index 3973fef..eab88ec 100644 --- a/src/cli/flag_update.rs +++ b/src/cli/flag_update.rs @@ -1,3 +1,4 @@ +use crate::utils::log::{error, warn}; use reqwest::blocking::Client; use serde::Deserialize; use std::fs; @@ -20,7 +21,7 @@ struct ReleaseAsset { pub fn flag_update(args: &[String]) -> i32 { if !args.is_empty() { - println!("Ошибка: команда не поддежривает аргументы"); + warn("Command does not support additional arguments"); return 1; } @@ -29,7 +30,7 @@ pub fn flag_update(args: &[String]) -> i32 { let client = match Client::builder().user_agent("dcr-updater").build() { Ok(client) => client, Err(_) => { - println!("Ошибка: не удалось инициализировать HTTP клиент"); + error("Failed to initialize HTTP client"); return 1; } }; @@ -37,14 +38,14 @@ pub fn flag_update(args: &[String]) -> i32 { let release = match fetch_latest_release(&client) { Ok(release) => release, Err(err) => { - println!("Ошибка: не удалось проверить обновления: {err}"); + error(&format!("Failed to check for updates: {err}")); return 1; } }; let latest_version = release.tag_name.trim_start_matches('v'); if latest_version == current_version { - println!("Установлена последняя версия: {current_version}"); + println!("Latest version is already installed: {current_version}"); return 0; } @@ -54,14 +55,14 @@ pub fn flag_update(args: &[String]) -> i32 { .iter() .find(|asset| candidate_names.iter().any(|name| name == &asset.name)) else { - println!("Ошибка: не найден бинарник для таргета {target}"); + error(&format!("Binary for target {target} not found")); return 1; }; let bytes = match download_asset(&client, &asset.browser_download_url) { Ok(bytes) => bytes, Err(err) => { - println!("Ошибка: не удалось скачать обновление: {err}"); + error(&format!("Failed to download update: {err}")); return 1; } }; @@ -69,26 +70,26 @@ pub fn flag_update(args: &[String]) -> i32 { let current_exe = match std::env::current_exe() { Ok(path) => path, Err(_) => { - println!("Ошибка: не удалось определить путь текущего бинарника"); + error("Failed to resolve current binary path"); return 1; } }; let temp_path = temp_binary_path(¤t_exe); if fs::write(&temp_path, &bytes).is_err() { - println!("Ошибка: не удалось записать временный бинарник"); + error("Failed to write temporary binary"); return 1; } set_executable_permissions(&temp_path); if self_replace::self_replace(&temp_path).is_err() { let _ = fs::remove_file(&temp_path); - println!("Ошибка: не удалось заменить текущий бинарник"); + error("Failed to replace current binary"); return 1; } let _ = fs::remove_file(&temp_path); - println!("Обновление завершено: {current_version} -> {latest_version}"); + println!("Update completed: {current_version} -> {latest_version}"); 0 } @@ -96,31 +97,31 @@ fn fetch_latest_release(client: &Client) -> Result { let response = client .get(LATEST_RELEASE_URL) .send() - .map_err(|_| "запрос к GitHub API завершился ошибкой".to_string())?; + .map_err(|_| "GitHub API request failed".to_string())?; if !response.status().is_success() { - return Err(format!("GitHub API вернул статус {}", response.status())); + return Err(format!("GitHub API returned status {}", response.status())); } response .json::() - .map_err(|_| "ответ GitHub API имеет неожиданный формат".to_string()) + .map_err(|_| "GitHub API response has an unexpected format".to_string()) } fn download_asset(client: &Client, url: &str) -> Result, String> { let response = client .get(url) .send() - .map_err(|_| "запрос на скачивание завершился ошибкой".to_string())?; + .map_err(|_| "Download request failed".to_string())?; if !response.status().is_success() { - return Err(format!("скачивание вернуло статус {}", response.status())); + return Err(format!("Download returned status {}", response.status())); } response .bytes() .map(|bytes| bytes.to_vec()) - .map_err(|_| "не удалось прочитать скачанные данные".to_string()) + .map_err(|_| "Failed to read downloaded data".to_string()) } fn asset_candidates(target: &str) -> Vec { diff --git a/src/cli/help.rs b/src/cli/help.rs index b148a2b..9c9525d 100644 --- a/src/cli/help.rs +++ b/src/cli/help.rs @@ -1,36 +1,33 @@ -use crate::utils::text::{BOLD, BRIGHT_CYAN, BRIGHT_GREEN, colored}; +use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, printc}; pub fn help() -> i32 { - let green_bold = BRIGHT_GREEN.to_owned() + BOLD; - let cyan_bold = BRIGHT_CYAN.to_owned() + BOLD; - println!("DCR (Dexoron Cargo Realization)"); - println!("Менеджер C-проектов, вдохновленный Cargo."); + println!("C project manager inspired by Cargo."); println!(); - println!("{}", colored("ИСПОЛЬЗОВАНИЕ:", &green_bold)); - println!("{}", colored(" dcr <команда> [опции]", &cyan_bold)); + printc("USAGE:", BOLD_GREEN); + printc(" dcr [options]", BOLD_CYAN); println!(); - println!("{}", colored("КОМАНДЫ:", &green_bold)); - println!(" new Создать новый проект"); - println!(" init Инициализировать текущую директорию как проект"); - println!(" build [--profile] Собрать проект (по умолчанию: --debug)"); - println!(" run [--profile] Собрать и запустить (по умолчанию: --debug)"); - println!(" clean Удалить директорию target"); - println!("{}", colored("ФЛАГИ:", &green_bold)); - println!(" --help Показать справку по команде"); - println!(" --update Обновить dcr до актуальной версии"); - println!(" --version Показать версию dcr"); + printc("COMMANDS:", BOLD_GREEN); + println!(" new Create a new project"); + println!(" init Initialize the current directory as a project"); + println!(" build [--profile] Build the project (default: --debug)"); + println!(" run [--profile] Build and run the project (default: --debug)"); + println!(" clean Remove the target directory"); + printc("FLAGS:", BOLD_GREEN); + println!(" --help Show command help"); + println!(" --update Update dcr to the latest version"); + println!(" --version Show dcr version"); println!(); - println!("{}", colored("ОПЦИИ:", &green_bold)); - println!(" --debug Сборка с профилем debug"); - println!(" --release Сборка с профилем release"); + printc("OPTIONS:", BOLD_GREEN); + println!(" --debug Build with debug profile"); + println!(" --release Build with release profile"); println!(); - println!("{}", colored("ПРИМЕРЫ:", &green_bold)); - println!("{}", colored(" dcr new hello", &cyan_bold)); - println!("{}", colored(" dcr build --release", &cyan_bold)); - println!("{}", colored(" dcr run --debug", &cyan_bold)); + printc("EXAMPLES:", BOLD_GREEN); + printc(" dcr new hello", BOLD_CYAN); + printc(" dcr build --release", BOLD_CYAN); + printc(" dcr run --debug", BOLD_CYAN); println!(); - println!("{}", colored("ПОДСКАЗКА:", &green_bold)); - println!(" Запусти 'dcr <команда> --help' для справки по команде."); + printc("TIP:", BOLD_GREEN); + println!(" Run 'dcr --help' for command-specific help."); 0 } diff --git a/src/cli/init.rs b/src/cli/init.rs index 39699ad..8971405 100644 --- a/src/cli/init.rs +++ b/src/cli/init.rs @@ -1,19 +1,13 @@ use crate::config::{FILE_MAIN_C, file_dcr_toml}; use crate::utils::fs::check_dir; -use crate::utils::text::{BOLD, BRIGHT_CYAN, BRIGHT_GREEN, BRIGHT_RED, colored, printc}; +use crate::utils::log::{error, warn}; +use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, colored, printc}; use std::fs; use std::io::Write; pub fn init(args: &[String]) -> i32 { - let red_bold = BRIGHT_RED.to_owned() + BOLD; - let green_bold = BRIGHT_GREEN.to_owned() + BOLD; - let cyan_bold = BRIGHT_CYAN.to_owned() + BOLD; - if !args.is_empty() { - println!( - "{}: команда не поддерживает доп. аргументы", - colored("error", &red_bold) - ); + warn("Command does not support additional arguments"); return 1; } @@ -24,22 +18,19 @@ pub fn init(args: &[String]) -> i32 { .unwrap_or_else(|| "project".to_string()); if !items.is_empty() { - println!("{}: директория не пуста", colored("error", &red_bold)); + error("Directory not empty"); return 1; } let cwd = std::env::current_dir() .map(|v| v.to_string_lossy().to_string()) .unwrap_or_else(|_| ".".to_string()); - println!("Инициализация проекта в {cwd}"); + println!("Initializing the project in {cwd}"); let mut dcr_toml = match fs::File::create("./dcr.toml") { Ok(file) => file, Err(_) => { - println!( - "{}: не удалось создать dcr.toml", - colored("error", &red_bold) - ); + error("Failed to create dcr.toml"); return 1; } }; @@ -47,50 +38,41 @@ pub fn init(args: &[String]) -> i32 { .write_all(file_dcr_toml(&project_name).as_bytes()) .is_err() { - println!( - "{}: не удалось записать dcr.toml", - colored("error", &red_bold) - ); + error("Failed to write dcr.toml"); return 1; } println!( - " {} Создан файл {}", - colored("✔", &green_bold), - colored("dcr.toml", &cyan_bold) + " {} Created file {}", + colored("✔", BOLD_CYAN), + colored("dcr.toml", BOLD_CYAN) ); if fs::create_dir("src").is_err() { - println!("{}: не удалось создать src", colored("error", &red_bold)); + error("Failed to create src/"); return 1; } let mut main_c = match fs::File::create("./src/main.c") { Ok(file) => file, Err(_) => { - println!( - "{}: не удалось создать src/main.c", - colored("error", &red_bold) - ); + error("Failed to create src/main.c"); return 1; } }; if main_c.write_all(FILE_MAIN_C.as_bytes()).is_err() { - println!( - "{}: не удалось записать src/main.c", - colored("error", &red_bold) - ); + error("Failed to write src/main.c"); return 1; } println!( - " {} Создан файл {}\n", - colored("✔", &green_bold), - colored("src/main.c", &cyan_bold) + " {} Created file {}\n", + colored("✔", BOLD_GREEN), + colored("src/main.c", BOLD_CYAN) ); println!( - "Проект `{}` успешно создан\n", - colored(&project_name, &green_bold) + "Project `{}` successfully created\n", + colored(project_name.as_str(), BOLD_GREEN) ); - printc("Следуюший шаг:", &green_bold); - printc(" dcr run", &cyan_bold); + printc("Next step:", BOLD_GREEN); + printc(" cd {}\n dcr run", project_name.as_str()); 0 } diff --git a/src/cli/new.rs b/src/cli/new.rs index c2bc7a2..de504d3 100644 --- a/src/cli/new.rs +++ b/src/cli/new.rs @@ -1,60 +1,48 @@ use crate::config::{FILE_MAIN_C, file_dcr_toml}; use crate::utils::fs::check_dir; -use crate::utils::text::{BOLD, BRIGHT_CYAN, BRIGHT_GREEN, BRIGHT_RED, colored, printc}; +use crate::utils::log::{error, warn}; +use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, colored, printc}; use std::fs; use std::io::Write; pub fn new(args: &[String]) -> i32 { let items = check_dir(None).unwrap_or_default(); - let red_bold = BRIGHT_RED.to_owned() + BOLD; - let green_bold = BRIGHT_GREEN.to_owned() + BOLD; - let cyan_bold = BRIGHT_CYAN.to_owned() + BOLD; if args.is_empty() { - println!( - "{}: не указанно название проекта", - colored("error", &red_bold) - ); + error("Project name not specified"); return 1; } if args.len() > 1 { - println!( - "{}: команда не поддерживает доп. аргументы", - colored("error", &red_bold) - ); + warn("Command does not support additional arguments"); return 1; } let project_name = &args[0]; println!( - "Создание проекта `{}`...", - colored(project_name, &green_bold) + "Creating a Project `{}`...", + colored(project_name, BOLD_CYAN) ); if items.contains(project_name) { + error(&format!( + "Directory `{}` already exists\n", + colored(project_name, BOLD_CYAN) + )); + printc("Подсказка:", BOLD_CYAN); println!( - "{}: директория `{}` уже существует\n", - colored("error", &red_bold), - colored(project_name, &green_bold) - ); - printc("Подсказка:", &green_bold); - println!( - " Используй `{}` для инициализации существующего проекта\n или задай другое имя проекта", - colored("dcr init", &cyan_bold) + " Use `{}` to initialize an existing project\n or specify a different project name", + colored("dcr init", BOLD_CYAN) ); return 1; } if fs::create_dir(project_name).is_err() { - println!( - "{}: не удалось создать директорию", - colored("error", &red_bold) - ); + error("Failed to create directory"); return 1; } println!( - " {} Создана директория {}", - colored("✔", &green_bold), + " {} Directory created {}", + colored("✔", BOLD_CYAN), project_name ); @@ -62,10 +50,7 @@ pub fn new(args: &[String]) -> i32 { let mut dcr_toml = match fs::File::create(&toml_path) { Ok(file) => file, Err(_) => { - println!( - "{}: не удалось создать dcr.toml", - colored("error", &red_bold) - ); + error("Failed to create dcr.toml"); return 1; } }; @@ -73,51 +58,42 @@ pub fn new(args: &[String]) -> i32 { .write_all(file_dcr_toml(project_name).as_bytes()) .is_err() { - println!( - "{}: не удалось записать dcr.toml", - colored("error", &red_bold) - ); + error("Failed to write dcr.toml"); return 1; } println!( - " {} Создан файл {}", - colored("✔", &green_bold), - colored("dcr.toml", &cyan_bold) + " {} Created file {}", + colored("✔", BOLD_CYAN), + colored("dcr.toml", BOLD_CYAN) ); if fs::create_dir_all(format!("./{project_name}/src")).is_err() { - println!("{}: не удалось создать src", colored("error", &red_bold)); + error("Failed to create src/"); return 1; } let main_c_path = format!("./{project_name}/src/main.c"); let mut main_c = match fs::File::create(&main_c_path) { Ok(file) => file, Err(_) => { - println!( - "{}: не удалось создать src/main.c", - colored("error", &red_bold) - ); + error("Failed to create src/main.c"); return 1; } }; if main_c.write_all(FILE_MAIN_C.as_bytes()).is_err() { - println!( - "{}: не удалось записать src/main.c", - colored("error", &red_bold) - ); + error("Failed to write src/main.c"); return 1; } println!( - " {} Создан файл {}\n", - colored("✔", &green_bold), - colored("src/main.c", &cyan_bold) + " {} Created file {}\n", + colored("✔", BOLD_GREEN), + colored("src/main.c", BOLD_CYAN) ); println!( - "Проект `{}` успешно создан\n", - colored(project_name, &green_bold) + "Project `{}` successfully created\n", + colored(project_name, BOLD_GREEN) ); - printc("Следуюший шаг:", &green_bold); - printc(&format!(" cd {project_name}\n dcr run"), &cyan_bold); + printc("Next step:", BOLD_GREEN); + printc(" cd {}\n dcr run", project_name); 0 } diff --git a/src/cli/run.rs b/src/cli/run.rs index cbf69c8..5361973 100644 --- a/src/cli/run.rs +++ b/src/cli/run.rs @@ -1,16 +1,16 @@ use crate::cli::build::build; use crate::config::{PROFILE, flags}; use crate::utils::fs::check_dir; -use crate::utils::text::{BOLD, BRIGHT_RED, colored}; +use crate::utils::log::{error, warn}; +use crate::utils::text::{BOLD_GREEN, colored}; use std::process::Command; pub fn run(args: &[String]) -> i32 { - let red_bold = BRIGHT_RED.to_owned() + BOLD; let mut active_profile = PROFILE.to_string(); let items = check_dir(None).unwrap_or_default(); if !items.contains(&"dcr.toml".to_string()) { - println!("{}: не найден файл dcr.toml", colored("error", &red_bold)); + error("dcr.toml file not found"); return 1; } @@ -20,18 +20,21 @@ pub fn run(args: &[String]) -> i32 { if flags(candidate).is_some() { active_profile = candidate.to_string(); } else { - println!("{}: неизвестный флаг сборки", colored("error", &red_bold)); + warn("Unknown build flag"); return 1; } } else { - println!("{}: неизвестный аргумент", colored("error", &red_bold)); + warn("Unknown argument"); return 1; } } let build_status = build(args); if build_status == 0 { - println!("\n Запуск target/{active_profile}/main"); + println!( + "\n {} target/{active_profile}/main", + colored("Running", BOLD_GREEN) + ); println!("--------------------------------"); return Command::new(format!("./target/{active_profile}/main")) .status() @@ -43,13 +46,13 @@ pub fn run(args: &[String]) -> i32 { .unwrap_or_default() .contains(&active_profile) { - println!("Запуск последнего релиза"); + warn("Launch of the latest release"); return Command::new(format!("./target/{active_profile}/main")) .status() .map(|status| status.code().unwrap_or(1)) .unwrap_or(1); } - println!("Исправьте ошибки в коде для запуска проекта"); + error("Fix errors in the code to run the project"); 0 } diff --git a/src/main.rs b/src/main.rs index d9d390b..9348f4b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ +use crate::utils::log::error; mod cli; mod config; mod utils; @@ -25,7 +26,7 @@ fn main() { "--help" => cli::help::help(), "--update" => cli::flag_update::flag_update(rest), _ => { - println!("Неизвестная команда или аргумент"); + error("Unknown command or argument"); 0 } }; diff --git a/src/utils/fs.rs b/src/utils/fs.rs index 7b0741f..9b60307 100644 --- a/src/utils/fs.rs +++ b/src/utils/fs.rs @@ -1,6 +1,7 @@ use std::io; use std::path::PathBuf; +#[allow(dead_code)] pub fn check_dir(dir: Option<&str>) -> io::Result> { let path: PathBuf = match dir { None | Some(".") | Some("./") => std::env::current_dir()?, diff --git a/src/utils/log.rs b/src/utils/log.rs index 5b9d138..411c2e2 100644 --- a/src/utils/log.rs +++ b/src/utils/log.rs @@ -1,30 +1,24 @@ -use crate::utils::text::{BOLD, BRIGHT_GREEN, BRIGHT_RED, BRIGHT_YELLOW, colored}; +use crate::utils::text::{BOLD_CYAN, colored}; #[allow(dead_code)] pub fn error(msg: &str) { - println!( - "{}: {msg}", - colored("error", &(BRIGHT_RED.to_owned() + BOLD)) - ); + println!("{}: {msg}", colored("error", BOLD_CYAN),); } #[allow(dead_code)] pub fn warn(msg: &str) { - println!( - "{}: {msg}", - colored("warn", &(BRIGHT_YELLOW.to_owned() + BOLD)) - ); + println!("{}: {msg}", colored("warn", BOLD_CYAN),); } -#[allow(dead_code)] -pub fn info(msg: &str) { - println!("{}: {msg}", colored("info", BOLD)); -} - -#[allow(dead_code)] -pub fn ok(msg: &str) { - println!( - "{}: {msg}", - colored("ok", &(BRIGHT_GREEN.to_owned() + BOLD)) - ); -} +// #[allow(dead_code)] +// pub fn info(msg: &str) { +// println!("{}: {msg}", colored("info", BOLD)); +// } +// +// #[allow(dead_code)] +// pub fn ok(msg: &str) { +// println!( +// "{}: {msg}", +// colored("ok", &(BRIGHT_GREEN.to_owned() + BOLD)) +// ); +// } diff --git a/src/utils/text.rs b/src/utils/text.rs index 0ef1a2e..01eebe0 100644 --- a/src/utils/text.rs +++ b/src/utils/text.rs @@ -1,16 +1,32 @@ +#[allow(dead_code)] pub const RESET: &str = "\x1b[0m"; +#[allow(dead_code)] pub const BOLD: &str = "\x1b[1m"; +#[allow(dead_code)] pub const BRIGHT_RED: &str = "\x1b[91m"; +#[allow(dead_code)] pub const BRIGHT_GREEN: &str = "\x1b[92m"; +#[allow(dead_code)] pub const BRIGHT_YELLOW: &str = "\x1b[93m"; +#[allow(dead_code)] pub const BRIGHT_CYAN: &str = "\x1b[96m"; +#[allow(dead_code)] +pub const BOLD_RED: &str = "\x1b[1m\x1b[91m"; +#[allow(dead_code)] +pub const BOLD_GREEN: &str = "\x1b[1m\x1b[92m"; +#[allow(dead_code)] +pub const BOLD_YELLOW: &str = "\x1b[1m\x1b[93m"; +#[allow(dead_code)] +pub const BOLD_CYAN: &str = "\x1b[1m\x1b[96m"; +#[allow(dead_code)] pub fn colored(msg: &str, style: &str) -> String { format!("{style}{msg}{RESET}") } +#[allow(dead_code)] pub fn printc(msg: &str, style: &str) { println!("{style}{msg}{RESET}"); }