From fa51df5d748d9d9e3927c56d33e1437a05a8abb1 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Fri, 23 Jan 2026 05:29:28 +0800 Subject: Update command registration to auto-discover commands Commands in `./src/cmds/` are now automatically registered. The `[cmd]` section in `.cargo/registry.toml` is now only for overriding or registering commands outside the auto-discovery path. --- .cargo/registry.toml | 12 +++++++++--- Cargo.lock | 1 + Cargo.toml | 3 +++ build.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 3 deletions(-) diff --git a/.cargo/registry.toml b/.cargo/registry.toml index 060ca0a..f581074 100644 --- a/.cargo/registry.toml +++ b/.cargo/registry.toml @@ -2,14 +2,20 @@ ### Commands ### ################ -[cmd.status] -node = "status" -type = "cmds::status::JVStatusCommand" +# The system will automatically register commands under ./src/cmds/. +# This section is mainly for registering commands not in the automatic registration directory. + +# [cmd.name] +# node = "name" +# type = "your_command::JVUnknownCommand" ################# ### Renderers ### ################# +# Only register renderers here that need to be overridden using the `--renderer` flag. +# After registration, you can use the format `command --renderer renderer_name` to override the renderer. + # Default Renderer [renderer.default] name = "default" diff --git a/Cargo.lock b/Cargo.lock index 20b0ee1..b2e9d00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1009,6 +1009,7 @@ dependencies = [ "rust-i18n", "serde", "serde_json", + "string_proc", "strip-ansi-escapes", "thiserror", "tokio", diff --git a/Cargo.toml b/Cargo.toml index 3dd3903..379a5ea 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,6 +31,9 @@ panic = "abort" strip = true [build-dependencies] +# Just Enough VCS String Formatter +string_proc = { path = "../VersionControl/utils/string_proc/" } + chrono = "0.4" toml = "0.9" diff --git a/build.rs b/build.rs index 70e7e28..8ee2245 100644 --- a/build.rs +++ b/build.rs @@ -2,6 +2,10 @@ use std::env; use std::path::PathBuf; use std::process::Command; +use string_proc::pascal_case; + +const COMMANDS_PATH: &str = "./src/cmds/"; + const COMPILE_INFO_RS_TEMPLATE: &str = "./templates/compile_info.rs.template"; const COMPILE_INFO_RS: &str = "./src/data/compile_info.rs"; @@ -253,6 +257,7 @@ fn generate_cmd_registry_file(repo_root: &PathBuf) -> Result<(), Box Result<(), Box ext, + None => continue, + }; + + if extension != "rs" { + continue; + } + + let file_name = match path.file_stem().and_then(|s| s.to_str()) { + Some(name) => name, + None => continue, + }; + + // Skip files that start with underscore + if file_name.starts_with('_') { + continue; + } + + // Convert filename to PascalCase + let pascal_name = pascal_case!(file_name); + + let key = file_name.to_string(); + let node = file_name.replace(".", " "); + let cmd_type = format!("cmds::{}::JV{}Command", file_name, pascal_name); + + nodes.push(node.clone()); + commands.push((key, node, cmd_type)); + } + } + // Extract the node_if template from the template content const PROCESS_MARKER: &str = "// PROCESS"; const TEMPLATE_START: &str = "// -- TEMPLATE START --"; -- cgit