diff --git a/src/cli/add.rs b/src/cli/add.rs index 44cfb40..4fb1f7f 100644 --- a/src/cli/add.rs +++ b/src/cli/add.rs @@ -15,10 +15,11 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use crate::prelude::*; + use crate::core::build_config::Config; use crate::core::deps::register; use crate::utils::fs::find_project_root; -use crate::utils::log::error; use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, colored, printc}; use toml::Value; use toml::map::Map; @@ -91,7 +92,7 @@ pub fn add(args: &[String]) -> i32 { let start_dir = match std::env::current_dir() { Ok(dir) => dir, Err(_) => { - error("Failed to determine current directory"); + error!("Failed to determine current directory"); return 1; } }; @@ -99,11 +100,11 @@ pub fn add(args: &[String]) -> i32 { let root = match find_project_root(&start_dir) { Ok(Some(dir)) => dir, Ok(None) => { - error("dcr.toml file not found"); + error!("dcr.toml file not found"); return 1; } Err(_) => { - error("Failed to find project root"); + error!("Failed to find project root"); return 1; } }; @@ -111,7 +112,7 @@ pub fn add(args: &[String]) -> i32 { let mut config = match Config::open(&root.join("dcr.toml").to_string_lossy()) { Ok(cfg) => cfg, Err(err) => { - error(&err.to_string()); + error!("{}", &err.to_string()); return 1; } }; @@ -154,13 +155,13 @@ pub fn add(args: &[String]) -> i32 { } else if let Some(version) = add_args.version_from_registry { Value::String(version) } else { - error("Dependency source (path, git, or pkg-config) must be provided"); + error!("Dependency source (path, git, or pkg-config) must be provided"); return 1; }; let key = format!("dependencies.{}", add_args.name); if let Err(err) = config.edit(&key, dep_value) { - error(&format!("Failed to update dcr.toml: {}", err)); + error!("Failed to update dcr.toml: {}", err); return 1; } @@ -179,13 +180,13 @@ pub fn add(args: &[String]) -> i32 { /// `path:`, `github:`, `gitlab:`, or `git:` prefixes, or a full git URL. fn parse_add_args(args: &[String]) -> Result { if args.is_empty() { - error("Usage: dcr add [--branch | --tag | --rev ]"); - error("Sources:"); - error(" github:user/repo -> github.com/user/repo"); - error(" gitlab:user/repo -> gitlab.com/user/repo"); - error(" git:host.com/user/repo -> host.com/user/repo"); - error(" path:./path/to/lib -> local path"); - error(" pkg-config:fmt -> system pkg-config package"); + error!("Usage: dcr add [--branch | --tag | --rev ]"); + error!("Sources:"); + error!(" github:user/repo -> github.com/user/repo"); + error!(" gitlab:user/repo -> gitlab.com/user/repo"); + error!(" git:host.com/user/repo -> host.com/user/repo"); + error!(" path:./path/to/lib -> local path"); + error!(" pkg-config:fmt -> system pkg-config package"); return Err(1); } @@ -198,7 +199,7 @@ fn parse_add_args(args: &[String]) -> Result { let mut iter = args.iter(); if let Some(n) = iter.next() { if n.starts_with("--") { - error("First argument must be the dependency name"); + error!("First argument must be the dependency name"); return Err(1); } name = n.clone(); @@ -206,7 +207,7 @@ fn parse_add_args(args: &[String]) -> Result { if let Some(s) = iter.next() { if s.starts_with("--") { - error("Second argument must be the dependency source"); + error!("Second argument must be the dependency source"); return Err(1); } source_spec = s.clone(); @@ -225,7 +226,7 @@ fn parse_add_args(args: &[String]) -> Result { ) }) .map_err(|(msg, code)| { - error(&msg); + error!("{msg}"); code })?; return Ok(AddArgs { @@ -240,7 +241,7 @@ fn parse_add_args(args: &[String]) -> Result { }); } Err(e) => { - error(&format!("Cannot add `{}` without source: {}", name, e)); + error!("Cannot add `{}` without source: {}", name, e); return Err(1); } } @@ -251,26 +252,26 @@ fn parse_add_args(args: &[String]) -> Result { "--branch" => { branch = iter.next().cloned(); if branch.is_none() { - error("--branch requires a value"); + error!("--branch requires a value"); return Err(1); } } "--tag" => { tag = iter.next().cloned(); if tag.is_none() { - error("--tag requires a value"); + error!("--tag requires a value"); return Err(1); } } "--rev" => { rev = iter.next().cloned(); if rev.is_none() { - error("--rev requires a value"); + error!("--rev requires a value"); return Err(1); } } _ => { - error(&format!("Unknown argument: {}", arg)); + error!("Unknown argument: {arg}"); return Err(1); } } @@ -292,7 +293,7 @@ fn parse_add_args(args: &[String]) -> Result { .map(str::to_string) .collect::>(); if packages.is_empty() { - error("pkg-config source must name at least one package"); + error!("pkg-config source must name at least one package"); return Err(1); } pkg_config = Some(packages); @@ -326,7 +327,7 @@ fn parse_add_args(args: &[String]) -> Result { { path = Some(source_spec); } else { - error( + error!( "Source must be a path, pkg-config:, a prefixed source (path:, git:, github:, gitlab:), or a full URL", ); return Err(1); diff --git a/src/cli/build.rs b/src/cli/build.rs index 2975bfe..9e73aea 100644 --- a/src/cli/build.rs +++ b/src/cli/build.rs @@ -15,6 +15,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use crate::prelude::*; + use crate::cli::clean::clean; use crate::cli::flags::parse_build_run_flags; use crate::cli::r#gen::{ProjectInfo, write_dcr_metadata}; @@ -27,7 +29,6 @@ use crate::utils::build::{ normalize_kind, resolve_artifact_target_dir, resolve_compiler, }; use crate::utils::fs::{canonicalize_path, find_project_root}; -use crate::utils::log::error; use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, BOLD_YELLOW, colored, printc}; use std::io::IsTerminal; use std::path::Path; @@ -173,18 +174,18 @@ pub fn build(args: &[String]) -> i32 { let start_dir = match std::env::current_dir() { Ok(dir) => dir, Err(_) => { - error("Failed to determine current directory"); + error!("Failed to determine current directory"); return 1; } }; let root = match find_project_root(&start_dir) { Ok(Some(dir)) => canonicalize_path(&dir), Ok(None) => { - error("dcr.toml file not found"); + error!("dcr.toml file not found"); return 1; } Err(_) => { - error("Failed to find project root"); + error!("Failed to find project root"); return 1; } }; @@ -242,7 +243,7 @@ pub fn build(args: &[String]) -> i32 { } Err(err) => { common::finish_progress_line(); - error(&err.message); + error!("{}", &err.message); 1 } } diff --git a/src/cli/clean.rs b/src/cli/clean.rs index 2c02b95..0c0e8e7 100644 --- a/src/cli/clean.rs +++ b/src/cli/clean.rs @@ -15,11 +15,12 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use crate::prelude::*; + use crate::core::build_config::Config; use crate::core::workspace::parse_workspace; use crate::utils::build::{default_profile_flags, default_target_triple, parse_version_info}; use crate::utils::fs::{check_dir, find_project_root, with_dir}; -use crate::utils::log::{error, warn}; use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, colored, printc}; use glob::glob; use std::fs; @@ -56,25 +57,25 @@ pub fn clean(args: &[String]) -> i32 { let start_dir = match std::env::current_dir() { Ok(dir) => dir, Err(_) => { - error("Failed to determine current directory"); + error!("Failed to determine current directory"); return 1; } }; let root = match find_project_root(&start_dir) { Ok(Some(dir)) => dir, Ok(None) => { - error("dcr.toml file not found"); + error!("dcr.toml file not found"); return 1; } Err(_) => { - error("Failed to find project root"); + error!("Failed to find project root"); return 1; } }; let flags = match parse_clean_flags(args) { Ok(v) => v, Err(msg) => { - error(&msg); + error!("{msg}"); return 1; } }; @@ -83,7 +84,7 @@ pub fn clean(args: &[String]) -> i32 { match with_dir(&root, || clean_from_root(&root, &flags)) { Ok(()) => 0, Err(msg) => { - error(&msg); + error!("{msg}"); 1 } } @@ -229,7 +230,7 @@ fn clean_project_at( target_items.contains(&profile.to_string()) }; if !dir_exists { - warn(&format!("Directory target/{} not found", target_dir)); + warn!("Directory target/{target_dir} not found"); } else { println!(" Profile: {}", colored(profile, BOLD_GREEN)); if let Some(t) = target { @@ -253,7 +254,7 @@ fn clean_project_at( colored("\n ✔", BOLD_GREEN) ); } else { - warn("Directory target not found"); + warn!("Directory target not found"); } clean_custom_paths(&config, "debug")?; clean_custom_paths(&config, "release")?; diff --git a/src/cli/flag_update.rs b/src/cli/flag_update.rs index 8e0fa0d..4819d0a 100644 --- a/src/cli/flag_update.rs +++ b/src/cli/flag_update.rs @@ -15,7 +15,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::utils::log::{error, warn}; +use crate::prelude::*; + use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, printc}; use serde::Deserialize; use std::fs; @@ -64,21 +65,21 @@ pub fn flag_update(args: &[String]) -> i32 { } if !args.is_empty() { - warn("Command does not support additional arguments"); + warn!("Command does not support additional arguments"); return 1; } let current_exe = match std::env::current_exe() { Ok(path) => path, Err(_) => { - error("Failed to resolve current binary path"); + error!("Failed to resolve current binary path"); return 1; } }; // Refuse self-update when the binary is owned by pacman/AUR. if let Some(package_name) = pacman_owned_package(¤t_exe) { - warn("This dcr binary is managed by pacman/AUR"); + warn!("This dcr binary is managed by pacman/AUR"); println!( "Update via package manager: yay/paru -Syu {package_name} or sudo pacman -Syu {package_name}" ); @@ -91,7 +92,7 @@ pub fn flag_update(args: &[String]) -> i32 { let release = match fetch_latest_release() { Ok(release) => release, Err(err) => { - error(&format!("Failed to check for updates: {err}")); + error!("Failed to check for updates: {err}"); return 1; } }; @@ -109,14 +110,14 @@ pub fn flag_update(args: &[String]) -> i32 { .iter() .find(|asset| candidate_names.iter().any(|name| name == &asset.name)) else { - error(&format!("Binary for target {target} not found")); + error!("Binary for target {target} not found"); return 1; }; let bytes = match download_asset(&asset.browser_download_url) { Ok(bytes) => bytes, Err(err) => { - error(&format!("Failed to download update: {err}")); + error!("Failed to download update: {err}"); return 1; } }; @@ -124,7 +125,7 @@ pub fn flag_update(args: &[String]) -> i32 { let temp_path = temp_binary_path(¤t_exe); if fs::write(&temp_path, &bytes).is_err() { - error("Failed to write temporary binary"); + error!("Failed to write temporary binary"); return 1; } set_executable_permissions(&temp_path); @@ -132,7 +133,7 @@ pub fn flag_update(args: &[String]) -> i32 { // Replace the running executable in place, then clean up the temp file. if self_replace::self_replace(&temp_path).is_err() { let _ = fs::remove_file(&temp_path); - error("Failed to replace current binary"); + error!("Failed to replace current binary"); return 1; } diff --git a/src/cli/flags.rs b/src/cli/flags.rs index 257eddf..c063fcd 100644 --- a/src/cli/flags.rs +++ b/src/cli/flags.rs @@ -15,8 +15,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use crate::prelude::*; + use crate::config::{PROFILE, flags}; -use crate::utils::log::warn; /// Flags shared by the `build` and `run` CLI commands. pub struct BuildRunFlags { @@ -82,7 +83,7 @@ pub fn parse_build_run_flags(args: &[String]) -> Result { while let Some(arg) = iter.next() { // DCR build/run options are long flags only (`--name`). if !arg.starts_with("--") { - warn("Unknown argument"); + warn!("Unknown argument"); return Err(1); } let candidate = arg.trim_start_matches("--"); @@ -106,7 +107,7 @@ pub fn parse_build_run_flags(args: &[String]) -> Result { if let Some(w) = iter.next() { workspace = Some(w.clone()); } else { - warn("--workspace requires a value"); + warn!("--workspace requires a value"); return Err(1); } continue; @@ -115,7 +116,7 @@ pub fn parse_build_run_flags(args: &[String]) -> Result { if let Some(t) = iter.next() { target = Some(t.clone()); } else { - warn("--target requires a value"); + warn!("--target requires a value"); return Err(1); } continue; @@ -123,13 +124,13 @@ pub fn parse_build_run_flags(args: &[String]) -> Result { // Profile names come from config::flags; only one profile may be set. if flags(candidate).is_some() { if profile != PROFILE { - warn("Duplicate profile flag"); + warn!("Duplicate profile flag"); return Err(1); } profile = candidate.to_string(); continue; } - warn("Unknown build flag"); + warn!("Unknown build flag"); return Err(1); } diff --git a/src/cli/fmt.rs b/src/cli/fmt.rs index 0f91e7c..0219dc6 100644 --- a/src/cli/fmt.rs +++ b/src/cli/fmt.rs @@ -15,7 +15,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::utils::log::error; +use crate::prelude::*; + use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, colored, printc}; use glob::glob; use std::process::Command; @@ -88,11 +89,11 @@ pub fn fmt(args: &[String]) -> i32 { 0 } Ok(s) => { - error(&format!("clang-format failed with status: {}", s)); + error!("clang-format failed with status: {}", s); 1 } Err(e) => { - error(&format!("Failed to execute clang-format: {}", e)); + error!("Failed to execute clang-format: {}", e); 1 } } diff --git a/src/cli/gen.rs b/src/cli/gen.rs index 6e73b3a..3ac5f2f 100644 --- a/src/cli/gen.rs +++ b/src/cli/gen.rs @@ -15,6 +15,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use crate::prelude::*; + use crate::core::build::builder::BuildContext; use crate::core::build::builder::artifact::{absolute_artifact_path, resolve_artifact_path}; use crate::core::build::builder::collect_sources; @@ -29,7 +31,6 @@ use crate::utils::build::{ use crate::utils::fs::{ absolute_join, atomic_write, canonicalize_path, ensure_dcr_dir, find_project_root, }; -use crate::utils::log::error; use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, printc}; use std::path::{Path, PathBuf}; use std::time::{SystemTime, UNIX_EPOCH}; @@ -290,7 +291,7 @@ pub fn r#gen(args: &[String]) -> i32 { "vscode" => gen_vscode(rest), "clion" => gen_clion(rest), _ => { - error(&format!("Unknown gen subcommand: {subcommand}")); + error!("Unknown gen subcommand: {subcommand}"); 1 } } @@ -853,7 +854,7 @@ fn gen_project_info(args: &[String]) -> i32 { let all = match collect_all(&root, &profile) { Ok(v) => v, Err(e) => { - error(&e); + error!("{e}"); return 1; } }; @@ -975,7 +976,7 @@ fn gen_compile_commands(args: &[String]) -> i32 { let all = match collect_all(&root, &profile) { Ok(v) => v, Err(e) => { - error(&e); + error!("{e}"); return 1; } }; @@ -988,7 +989,7 @@ fn gen_compile_commands(args: &[String]) -> i32 { /// Used by `compile-commands`, `vscode`, and `clion`. fn gen_compile_commands_inner(root: &Path, profile: &str, all: &[ProjectInfo], quiet: bool) -> i32 { if let Err(e) = ensure_dcr_dir(root) { - error(&format!("Failed to create .dcr/: {e}")); + error!("Failed to create .dcr/: {e}"); return 1; } @@ -1009,7 +1010,7 @@ fn gen_compile_commands_inner(root: &Path, profile: &str, all: &[ProjectInfo], q 0 } Err(e) => { - error(&format!("Failed to write compile_commands.json: {e}")); + error!("Failed to write compile_commands.json: {e}"); 1 } } @@ -1163,7 +1164,7 @@ fn gen_vscode(args: &[String]) -> i32 { let all = match collect_all(&root, &profile) { Ok(v) => v, Err(e) => { - error(&e); + error!("{e}"); return 1; } }; @@ -1176,13 +1177,13 @@ fn gen_vscode(args: &[String]) -> i32 { let vscode_dir = root.join(".vscode"); if let Err(e) = std::fs::create_dir_all(&vscode_dir) { - error(&format!("Failed to create .vscode/: {e}")); + error!("Failed to create .vscode/: {e}"); return 1; } // tasks.json if let Err(e) = std::fs::write(vscode_dir.join("tasks.json"), gen_tasks_json()) { - error(&format!("Failed to write tasks.json: {e}")); + error!("Failed to write tasks.json: {e}"); return 1; } println!("Generated {}", vscode_dir.join("tasks.json").display()); @@ -1190,7 +1191,7 @@ fn gen_vscode(args: &[String]) -> i32 { // launch.json — one entry per binary target let launch = gen_launch_json(&all, &root); if let Err(e) = std::fs::write(vscode_dir.join("launch.json"), launch) { - error(&format!("Failed to write launch.json: {e}")); + error!("Failed to write launch.json: {e}"); return 1; } println!("Generated {}", vscode_dir.join("launch.json").display()); @@ -1198,14 +1199,14 @@ fn gen_vscode(args: &[String]) -> i32 { // settings.json (clangd compile-commands-dir) let settings = gen_settings_json(&root); if let Err(e) = std::fs::write(vscode_dir.join("settings.json"), settings) { - error(&format!("Failed to write settings.json: {e}")); + error!("Failed to write settings.json: {e}"); return 1; } println!("Generated {}", vscode_dir.join("settings.json").display()); // extensions.json — disable cpptools, recommend clangd if let Err(e) = std::fs::write(vscode_dir.join("extensions.json"), gen_extensions_json()) { - error(&format!("Failed to write extensions.json: {e}")); + error!("Failed to write extensions.json: {e}"); return 1; } println!("Generated {}", vscode_dir.join("extensions.json").display()); @@ -1453,7 +1454,7 @@ fn gen_clion(args: &[String]) -> i32 { let all = match collect_all(&root, &profile) { Ok(v) => v, Err(e) => { - error(&e); + error!("{e}"); return 1; } }; @@ -1466,19 +1467,19 @@ fn gen_clion(args: &[String]) -> i32 { let idea_dir = root.join(".idea"); if let Err(e) = std::fs::create_dir_all(&idea_dir) { - error(&format!("Failed to create .idea/: {e}")); + error!("Failed to create .idea/: {e}"); return 1; } let run_configs_dir = idea_dir.join("runConfigurations"); if let Err(e) = std::fs::create_dir_all(&run_configs_dir) { - error(&format!("Failed to create .idea/runConfigurations/: {e}")); + error!("Failed to create .idea/runConfigurations/: {e}"); return 1; } // externalTools.xml let ext_tools = gen_clion_external_tools(); if let Err(e) = std::fs::write(idea_dir.join("externalTools.xml"), ext_tools) { - error(&format!("Failed to write externalTools.xml: {e}")); + error!("Failed to write externalTools.xml: {e}"); return 1; } println!("Generated {}", idea_dir.join("externalTools.xml").display()); @@ -1486,7 +1487,7 @@ fn gen_clion(args: &[String]) -> i32 { // customTargets.xml let targets = gen_clion_custom_targets(); if let Err(e) = std::fs::write(idea_dir.join("customTargets.xml"), targets) { - error(&format!("Failed to write customTargets.xml: {e}")); + error!("Failed to write customTargets.xml: {e}"); return 1; } println!("Generated {}", idea_dir.join("customTargets.xml").display()); @@ -1494,7 +1495,7 @@ fn gen_clion(args: &[String]) -> i32 { // misc.xml — point CLion at compile_commands.json let misc = gen_clion_misc_xml(&root); if let Err(e) = std::fs::write(idea_dir.join("misc.xml"), misc) { - error(&format!("Failed to write misc.xml: {e}")); + error!("Failed to write misc.xml: {e}"); return 1; } println!("Generated {}", idea_dir.join("misc.xml").display()); @@ -1502,7 +1503,7 @@ fn gen_clion(args: &[String]) -> i32 { // .idea/.gitignore let gitignore = "# CLion generated files\nworkspace.xml\n*.iml\n"; if let Err(e) = std::fs::write(idea_dir.join(".gitignore"), gitignore) { - error(&format!("Failed to write .idea/.gitignore: {e}")); + error!("Failed to write .idea/.gitignore: {e}"); return 1; } println!("Generated {}", idea_dir.join(".gitignore").display()); @@ -1516,7 +1517,7 @@ fn gen_clion(args: &[String]) -> i32 { let fname = format!("{}.xml", sanitize_filename(&info.name)); let path = run_configs_dir.join(&fname); if let Err(e) = std::fs::write(&path, xml) { - error(&format!("Failed to write runConfigurations/{fname}: {e}")); + error!("Failed to write runConfigurations/{fname}: {e}"); return 1; } println!("Generated {}", path.display()); @@ -1720,18 +1721,18 @@ fn parse_gen_args(args: &[String]) -> Result<(PathBuf, String, bool), i32> { } let start = std::env::current_dir().map_err(|_| { - error("Failed to determine current directory"); + error!("Failed to determine current directory"); 1i32 })?; let root = match find_project_root(&start) { Ok(Some(r)) => canonicalize_path(&r), Ok(None) => { - error("dcr.toml not found"); + error!("dcr.toml not found"); return Err(1); } Err(_) => { - error("Failed to find project root"); + error!("Failed to find project root"); return Err(1); } }; diff --git a/src/cli/init.rs b/src/cli/init.rs index 4d80411..1a7cb72 100644 --- a/src/cli/init.rs +++ b/src/cli/init.rs @@ -15,11 +15,12 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use crate::prelude::*; + use crate::config::FILE_MAIN_C; use crate::core::build_config::{Config, validate_package_name}; use crate::core::vcs::VcsKind; use crate::utils::fs::check_dir; -use crate::utils::log::{error, warn}; use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, colored, printc}; use std::fs; use std::io::Write; @@ -48,7 +49,7 @@ pub fn init(args: &[String]) -> i32 { if let Some(val) = iter.next() { vcs_str = Some(val.clone()); } else { - error("--vcs requires a value"); + error!("--vcs requires a value"); return 1; } } else if let Some(stripped) = arg.strip_prefix("--vcs=") { @@ -59,7 +60,7 @@ pub fn init(args: &[String]) -> i32 { } if !clean_args.is_empty() { - warn("Command does not support additional arguments"); + warn!("Command does not support additional arguments"); return 1; } @@ -71,16 +72,15 @@ pub fn init(args: &[String]) -> i32 { .unwrap_or_else(|| "project".to_string()); if !items.is_empty() { - error("Directory not empty"); + error!("Directory not empty"); return 1; } if let Err(e) = validate_package_name(&project_name) { - error(&format!( - "Invalid project name `{}`: {}", + error!( + "Invalid project name `{}`: {e}", colored(&project_name, BOLD_CYAN), - e - )); + ); return 1; } @@ -91,7 +91,7 @@ pub fn init(args: &[String]) -> i32 { // Create and initialize default manifest (dcr.toml). if Config::create("./dcr.toml", Some(&project_name)).is_err() { - error("Failed to create dcr.toml"); + error!("Failed to create dcr.toml"); return 1; } println!( @@ -102,18 +102,18 @@ pub fn init(args: &[String]) -> i32 { // Create src directory and write template main.c file. if fs::create_dir("src").is_err() { - error("Failed to create src/"); + error!("Failed to create src/"); return 1; } let mut main_c = match fs::File::create("./src/main.c") { Ok(file) => file, Err(_) => { - error("Failed to create src/main.c"); + error!("Failed to create src/main.c"); return 1; } }; if main_c.write_all(FILE_MAIN_C.as_bytes()).is_err() { - error("Failed to write src/main.c"); + error!("Failed to write src/main.c"); return 1; } println!( @@ -128,7 +128,7 @@ pub fn init(args: &[String]) -> i32 { match VcsKind::parse(vcs_val) { Ok(kind) => vcs_kind = kind, Err(e) => { - error(&e); + error!("{e}"); return 1; } } @@ -142,7 +142,7 @@ pub fn init(args: &[String]) -> i32 { if crate::utils::git::is_git_available() { let project_path = std::path::Path::new("."); if let Err(e) = crate::core::vcs::init_vcs(vcs_kind, project_path) { - warn(&format!("Failed to initialize git repository: {}", e)); + warn!("Failed to initialize git repository: {e}"); } else { println!( " {} Initialized git repository", @@ -150,14 +150,14 @@ pub fn init(args: &[String]) -> i32 { ); } } else { - warn( + warn!( "Git is not installed or not found in PATH. Skipping Git repository initialization.", ); } } if let Err(e) = crate::utils::fs::ensure_gitignore_has_dcr(std::path::Path::new(".")) { - warn(&format!("Failed to update .gitignore: {e}")); + warn!("Failed to update .gitignore: {e}"); } println!( diff --git a/src/cli/lint.rs b/src/cli/lint.rs index b47b2ec..37f2c97 100644 --- a/src/cli/lint.rs +++ b/src/cli/lint.rs @@ -15,11 +15,12 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use crate::prelude::*; + use crate::core::build::common; use crate::core::build_config::Config; use crate::utils::build::{get_bool_with_profile, get_list_with_profile}; use crate::utils::fs::find_project_root; -use crate::utils::log::error; use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, BOLD_YELLOW, colored, printc}; use std::path::{Path, PathBuf}; use std::process::Command; @@ -46,7 +47,7 @@ pub fn lint(args: &[String]) -> i32 { let start_dir = match std::env::current_dir() { Ok(dir) => dir, Err(_) => { - error("Failed to determine current directory"); + error!("Failed to determine current directory"); return 1; } }; @@ -54,11 +55,11 @@ pub fn lint(args: &[String]) -> i32 { let root = match find_project_root(&start_dir) { Ok(Some(r)) => r, Ok(None) => { - error("dcr.toml not found"); + error!("dcr.toml not found"); return 1; } Err(_) => { - error("Failed to find project root"); + error!("Failed to find project root"); return 1; } }; @@ -66,7 +67,7 @@ pub fn lint(args: &[String]) -> i32 { let config = match Config::open(&root.join("dcr.toml").to_string_lossy()) { Ok(c) => c, Err(e) => { - error(&format!("Failed to load dcr.toml: {e}")); + error!("Failed to load dcr.toml: {e}"); return 1; } }; @@ -98,7 +99,7 @@ pub fn lint(args: &[String]) -> i32 { match common::collect_sources(&roots, &cxx_extensions, &exclude_dirs, &include_paths) { Ok(f) => f, Err(e) => { - error(&format!("Failed to collect source files: {e}")); + error!("Failed to collect source files: {e}"); return 1; } }; @@ -142,7 +143,7 @@ pub fn lint(args: &[String]) -> i32 { let output = match cmd.output() { Ok(o) => o, Err(e) => { - error(&format!("Failed to execute clang-tidy: {}", e)); + error!("Failed to execute clang-tidy: {e}"); return 1; } }; diff --git a/src/cli/new.rs b/src/cli/new.rs index f0671d4..e7ec5bb 100644 --- a/src/cli/new.rs +++ b/src/cli/new.rs @@ -15,11 +15,12 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use crate::prelude::*; + use crate::config::FILE_MAIN_C; use crate::core::build_config::{Config, validate_package_name}; use crate::core::vcs::VcsKind; use crate::utils::fs::check_dir; -use crate::utils::log::{error, warn}; use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, colored, printc}; use std::fs; use std::io::Write; @@ -50,7 +51,7 @@ pub fn new(args: &[String]) -> i32 { if let Some(val) = iter.next() { vcs_str = Some(val.clone()); } else { - error("--vcs requires a value"); + error!("--vcs requires a value"); return 1; } } else if let Some(stripped) = arg.strip_prefix("--vcs=") { @@ -61,11 +62,11 @@ pub fn new(args: &[String]) -> i32 { } if clean_args.is_empty() { - error("Project name not specified"); + error!("Project name not specified"); return 1; } if clean_args.len() > 1 { - warn("Command does not support additional arguments"); + warn!("Command does not support additional arguments"); return 1; } @@ -76,19 +77,18 @@ pub fn new(args: &[String]) -> i32 { ); if let Err(e) = validate_package_name(project_name) { - error(&format!( - "Invalid project name `{}`: {}", + error!( + "Invalid project name `{}`: {e}", colored(project_name, BOLD_CYAN), - e - )); + ); return 1; } if items.contains(project_name) { - error(&format!( + error!( "Directory `{}` already exists\n", colored(project_name, BOLD_CYAN) - )); + ); printc("Hint:", BOLD_CYAN); println!( " Use `{}` to initialize an existing project\n or specify a different project name", @@ -98,7 +98,7 @@ pub fn new(args: &[String]) -> i32 { } if fs::create_dir(project_name).is_err() { - error("Failed to create directory"); + error!("Failed to create directory"); return 1; } println!( @@ -110,7 +110,7 @@ pub fn new(args: &[String]) -> i32 { // Initialize and write project configuration manifest (dcr.toml). let toml_path = format!("./{project_name}/dcr.toml"); if Config::create(&toml_path, Some(project_name)).is_err() { - error("Failed to create dcr.toml"); + error!("Failed to create dcr.toml"); return 1; } println!( @@ -121,19 +121,19 @@ pub fn new(args: &[String]) -> i32 { // Generate src directory and populate initial main.c file. if fs::create_dir_all(format!("./{project_name}/src")).is_err() { - error("Failed to create src/"); + 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(_) => { - error("Failed to create src/main.c"); + error!("Failed to create src/main.c"); return 1; } }; if main_c.write_all(FILE_MAIN_C.as_bytes()).is_err() { - error("Failed to write src/main.c"); + error!("Failed to write src/main.c"); return 1; } println!( @@ -148,7 +148,8 @@ pub fn new(args: &[String]) -> i32 { match VcsKind::parse(vcs_val) { Ok(kind) => vcs_kind = kind, Err(e) => { - error(&e); + error!("{e}"); + return 1; } } @@ -162,7 +163,7 @@ pub fn new(args: &[String]) -> i32 { if crate::utils::git::is_git_available() { let project_path = std::path::Path::new(project_name); if let Err(e) = crate::core::vcs::init_vcs(vcs_kind, project_path) { - warn(&format!("Failed to initialize git repository: {}", e)); + warn!("Failed to initialize git repository: {e}"); } else { println!( " {} Initialized git repository", @@ -170,7 +171,7 @@ pub fn new(args: &[String]) -> i32 { ); } } else { - warn( + warn!( "Git is not installed or not found in PATH. Skipping Git repository initialization.", ); } @@ -178,7 +179,7 @@ pub fn new(args: &[String]) -> i32 { let project_path = std::path::Path::new(project_name); if let Err(e) = crate::utils::fs::ensure_gitignore_has_dcr(project_path) { - warn(&format!("Failed to update .gitignore: {e}")); + warn!("Failed to update .gitignore: {e}"); } println!( diff --git a/src/cli/run.rs b/src/cli/run.rs index fd11bf6..9bc2b85 100644 --- a/src/cli/run.rs +++ b/src/cli/run.rs @@ -15,6 +15,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use crate::prelude::*; + use crate::cli::build::build; use crate::cli::flags::parse_build_run_flags; use crate::core::build_config::Config; @@ -22,7 +24,6 @@ use crate::core::runner::run_binary; use crate::utils::build::{normalize_target_os, parse_version_info, substitute_vars}; use crate::utils::fs::find_project_root; use crate::utils::fs::with_dir; -use crate::utils::log::error; use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, colored, printc}; use std::path::Path; use std::process::Command; @@ -91,18 +92,18 @@ pub fn run(args: &[String]) -> i32 { let start_dir = match std::env::current_dir() { Ok(dir) => dir, Err(_) => { - error("Failed to determine current directory"); + error!("Failed to determine current directory"); return 1; } }; let root = match find_project_root(&start_dir) { Ok(Some(dir)) => dir, Ok(None) => { - error("dcr.toml file not found"); + error!("dcr.toml file not found"); return 1; } Err(_) => { - error("Failed to find project root"); + error!("Failed to find project root"); return 1; } }; @@ -111,7 +112,8 @@ pub fn run(args: &[String]) -> i32 { }) { Ok(cfg) => cfg, Err(err) => { - error(&err); + error!("{err}"); + return 1; } }; @@ -143,11 +145,12 @@ pub fn run(args: &[String]) -> i32 { ) { Ok(Some(ws)) => ws, Ok(None) => { - error("Workspace root has no members defined"); + error!("Workspace root has no members defined"); return 1; } Err(e) => { - error(&e); + error!("{e}"); + return 1; } }; @@ -159,9 +162,9 @@ pub fn run(args: &[String]) -> i32 { Some(m) => m, None => { if let Some(name) = &flags.workspace { - error(&format!("Workspace member '{name}' not found")); + error!("Workspace member '{name}' not found"); } else { - error("No workspace member to run (set `main = true` on one member)"); + error!("No workspace member to run (set `main = true` on one member)"); } return 1; } @@ -172,7 +175,8 @@ pub fn run(args: &[String]) -> i32 { }) { Ok(code) => code, Err(e) => { - error(&e); + error!("{e}"); + 1 } }; @@ -181,7 +185,7 @@ pub fn run(args: &[String]) -> i32 { match run_project(&root, &flags, None) { Ok(code) => code, Err(e) => { - error(&e); + error!("{e}"); 1 } } diff --git a/src/cli/test.rs b/src/cli/test.rs index 0d614c9..1efd968 100644 --- a/src/cli/test.rs +++ b/src/cli/test.rs @@ -15,6 +15,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use crate::prelude::*; + use crate::cli::build; use crate::config::{FILE_DCR_TEST_H, FILE_TEST_C, flags}; use crate::core::build_config::Config; @@ -23,7 +25,6 @@ use crate::utils::build::{ get_string_with_profile, resolve_compiler, resolve_pkg_config_flags, }; use crate::utils::fs::{find_project_root, with_dir}; -use crate::utils::log::error; use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, BOLD_RED, RESET, colored, printc}; use std::fs; use std::path::{Path, PathBuf}; @@ -60,25 +61,25 @@ pub fn test(args: &[String]) -> i32 { profile = arg.trim_start_matches("--"); continue; } - error("Unknown argument"); + error!("Unknown argument"); return 1; } let start_dir = match std::env::current_dir() { Ok(dir) => dir, Err(_) => { - error("Failed to determine current directory"); + error!("Failed to determine current directory"); return 1; } }; let root = match find_project_root(&start_dir) { Ok(Some(dir)) => dir, Ok(None) => { - error("dcr.toml file not found"); + error!("dcr.toml file not found"); return 1; } Err(_) => { - error("Failed to find project root"); + error!("Failed to find project root"); return 1; } }; @@ -87,7 +88,8 @@ pub fn test(args: &[String]) -> i32 { match with_dir(&root, ensure_test_header) { Ok(()) => {} Err(msg) => { - error(&msg); + error!("{msg}"); + return 1; } } @@ -96,7 +98,7 @@ pub fn test(args: &[String]) -> i32 { match with_dir(&root, || run_testsuite(profile)) { Ok(code) => code, Err(msg) => { - error(&msg); + error!("{msg}"); 1 } } diff --git a/src/cli/tree.rs b/src/cli/tree.rs index 5717c9b..ce9649a 100644 --- a/src/cli/tree.rs +++ b/src/cli/tree.rs @@ -15,8 +15,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use crate::prelude::*; + use crate::core::build_config::Config; -use crate::utils::log::error; use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, printc}; use std::collections::HashSet; use std::path::{Path, PathBuf}; @@ -40,7 +41,7 @@ pub fn tree(args: &[String]) -> i32 { let config = match Config::open("dcr.toml") { Ok(c) => c, Err(_) => { - error("dcr.toml not found in current directory"); + error!("dcr.toml not found in current directory"); return 1; } }; diff --git a/src/core/build_config.rs b/src/core/build_config.rs index e8ccd6b..d2070a9 100644 --- a/src/core/build_config.rs +++ b/src/core/build_config.rs @@ -15,6 +15,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use crate::prelude::*; + use serde::Deserialize; use std::collections::BTreeMap; use std::fs; @@ -334,35 +336,35 @@ impl Config { .map(str::trim) .filter(|s| !s.is_empty()); let Some(required) = required else { - crate::utils::log::warn(&format!( + warn!( "package.dcr-version is missing in {}. Add e.g. dcr-version = \"{tool}\" \ - so collaborators know which dcr this project targets \ - (written automatically by `dcr new` / `dcr init`).", - self.path.display() - )); + so collaborators know which dcr this project targets \ + (written automatically by `dcr new` / `dcr init`).", + self.path.display(), + ); return; }; match crate::utils::build::compare_semver(tool, required) { Some(std::cmp::Ordering::Less) => { - crate::utils::log::warn(&format!( + warn!( "this project requires dcr {required} (package.dcr-version), \ but you are running dcr {tool}. Some features may be missing or misbehave. \ Upgrade dcr (e.g. `dcr --update`) or lower package.dcr-version if intentional." - )); + ); } Some(std::cmp::Ordering::Greater) => { - crate::utils::log::warn(&format!( + warn!( "this project pins dcr {required} (package.dcr-version), \ - but you are running newer dcr {tool}. Config/defaults may be outdated. \ - Review the changelog and bump package.dcr-version when the project is verified." - )); + but you are running newer dcr {tool}. Config/defaults may be outdated. \ + Review the changelog and bump package.dcr-version when the project is verified.", + ); } Some(std::cmp::Ordering::Equal) => {} None => { - crate::utils::log::warn(&format!( - "package.dcr-version = \"{required}\" is not a valid semver (expected X.Y.Z); ignoring" - )); + warn!( + "package.dcr-version = \"{required}\" is not a valid semver (expected X.Y.Z); ignoring", + ); } } } diff --git a/src/utils/build.rs b/src/utils/build.rs index 8b716ec..df4714b 100644 --- a/src/utils/build.rs +++ b/src/utils/build.rs @@ -15,8 +15,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use crate::prelude::*; + use crate::core::build_config::Config; -use crate::utils::log::warn; use std::path::{Path, PathBuf}; /// Version information parsed from a version string. @@ -251,10 +252,10 @@ pub fn normalize_target_os(target: &str) -> &str { "windows" => "x86_64-pc-windows-msvc", _ if target.contains('-') => target, _ => { - warn(&format!( + warn!( "Unknown target '{}', using as-is. Supported short names: linux, macos, windows", target - )); + ); target } } diff --git a/src/utils/log.rs b/src/utils/log.rs index a03e55d..f38e445 100644 --- a/src/utils/log.rs +++ b/src/utils/log.rs @@ -15,9 +15,6 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -pub fn warn(_: &str) {} -pub fn error(_: &str) {} - use anstyle::{AnsiColor, Style}; use env_logger::*; use log::*;