cmdSupplier = COMMANDS.get(cmdName);
+
+ // 未知子命令处理
if (cmdSupplier == null) {
System.err.println("Unknown command: " + cmdName);
- printGeneralUsage();
+ CLIUtils.printGeneralUsage(COMMANDS);
System.exit(1);
}
+ // 创建对应子命令实例
CLICommand cmd = cmdSupplier.get();
+ // 提取子命令参数
String[] subArgs = Arrays.copyOfRange(args, 1, args.length);
- // —— 子命令帮助 —— //
- if (subArgs.length > 0 && GLOBAL_HELP_FLAGS.contains(subArgs[0])) {
+ // 如果子命令请求帮助,则打印该命令的用法说明并退出
+ if (subArgs.length > 0 && CLIUtils.GLOBAL_HELP_FLAGS.contains(subArgs[0])) {
cmd.printUsage();
System.exit(0);
}
- // —— 执行子命令 —— //
+ // 执行子命令并根据返回的退出码退出
try {
int exitCode = cmd.execute(subArgs);
System.exit(exitCode);
} catch (Exception e) {
+ // 捕获命令执行过程中的异常并打印错误消息
System.err.println("Error: " + e.getMessage());
System.exit(1);
}
}
-
- /**
- * 打印动态生成的通用帮助信息。
- *
- * 列出全局选项和所有注册子命令的名称与描述。
- */
- private static void printGeneralUsage() {
- System.out.println("Usage:");
- System.out.println(" snow [OPTIONS] ");
- System.out.println();
- System.out.println("Options:");
- // 动态遍历全局选项
- for (Option opt : GLOBAL_OPTIONS) {
- String flags = String.join(", ", opt.flags());
- System.out.printf(" %-15s %s%n", flags, opt.description());
- }
- System.out.println();
- System.out.println("Commands:");
- // 遍历注册的子命令,动态输出
- COMMANDS.forEach((name, supplier) -> {
- CLICommand c = supplier.get();
- System.out.printf(" %-10s %s%n", name, c.description());
- });
- System.out.println();
- System.out.println("Use \"snow --help\" for command-specific options.");
- }
-
- /**
- * 全局选项的数据结构,包含标志列表和描述信息。
- *
- * @param flags 选项的所有标志,例如 -h, --help
- * @param description 选项的功能说明
- */
- private record Option(List flags, String description) {
- }
}
diff --git a/src/main/java/org/jcnc/snow/compiler/cli/commands/VersionCommand.java b/src/main/java/org/jcnc/snow/compiler/cli/commands/VersionCommand.java
index 79cffc7..4e545d9 100644
--- a/src/main/java/org/jcnc/snow/compiler/cli/commands/VersionCommand.java
+++ b/src/main/java/org/jcnc/snow/compiler/cli/commands/VersionCommand.java
@@ -49,7 +49,8 @@ public final class VersionCommand implements CLICommand {
*/
@Override
public int execute(String[] args) {
- System.out.println("snow version " + SnowCLI.SNOW_VERSION);
+ System.out.println("snow version " + "\"" + SnowCLI.SNOW_VERSION + "\"");
+
return 0;
}
}
diff --git a/src/main/java/org/jcnc/snow/compiler/cli/utils/CLIUtils.java b/src/main/java/org/jcnc/snow/compiler/cli/utils/CLIUtils.java
new file mode 100644
index 0000000..5c09caf
--- /dev/null
+++ b/src/main/java/org/jcnc/snow/compiler/cli/utils/CLIUtils.java
@@ -0,0 +1,70 @@
+package org.jcnc.snow.compiler.cli.utils;
+
+import org.jcnc.snow.compiler.cli.CLICommand;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Supplier;
+
+/**
+ * 命令行界面通用工具类,提供全局帮助和版本标志、全局选项定义,以及打印通用用法的方法。
+ */
+public class CLIUtils {
+
+ /**
+ * 全局帮助标志集合,支持 "help"、"-h"、"--help"。
+ */
+ public static final Set GLOBAL_HELP_FLAGS = Set.of(
+ "help", "-h", "--help"
+ );
+
+ /**
+ * 全局版本标志集合,支持 "-v"、"--version"。
+ */
+ public static final Set GLOBAL_VERSION_FLAGS = Set.of(
+ "-v", "--version"
+ );
+
+ /**
+ * 全局选项列表,包括帮助和版本选项的描述。
+ */
+ public static final List