feat(argparse): 实现高级命令行参数解析库

- 添加完整的参数解析API,支持子命令、选项和参数定义
- 实现多种数据类型支持:字符串、布尔值、整数、浮点数、枚举等
- 添加约束规范结构体,支持必填项、多值、隐藏选项等功能
- 实现国际化支持,包含中英文错误提示和帮助信息
- 添加模糊匹配功能,当用户输入错误参数时提供相似建议
- 实现详细的帮助信息打印功能,包括使用方法、选项说明等
- 修改底层optparse库,优化选项处理和错误报告机制
- 添加向量类型支持用于管理参数、选项和子命令集合
This commit is contained in:
zzy
2026-02-12 21:41:57 +08:00
parent 34d7eb3c42
commit 191cdcef53
6 changed files with 777 additions and 67 deletions

View File

@@ -6,13 +6,13 @@
// 测试用例配置
static scc_optparse_opt_t test_opts[] = {
SCC_OPTPARSE_OPT('-', 'h', "help", 0, 0, NULL, NULL),
SCC_OPTPARSE_OPT('-', 'h', "help", 0, 0, NULL, NULL),
SCC_OPTPARSE_OPT('-', 'v', "verbose", 0, 0, NULL, NULL),
SCC_OPTPARSE_OPT('-', 'f', "file", 1, 1, NULL, NULL),
SCC_OPTPARSE_OPT('-', 'o', "output", 1, 1, NULL, NULL),
SCC_OPTPARSE_OPT('-', 'l', "list", 0, 10, NULL, NULL),
SCC_OPTPARSE_OPT('-', 'c', "count", 1, 3, NULL, NULL),
SCC_OPTPARSE_OPT('-', 'h', "help", 0, 0),
SCC_OPTPARSE_OPT('-', 'h', "help", 0, 0),
SCC_OPTPARSE_OPT('-', 'v', "verbose", 0, 0),
SCC_OPTPARSE_OPT('-', 'f', "file", 1, 1),
SCC_OPTPARSE_OPT('-', 'o', "output", 1, 1),
SCC_OPTPARSE_OPT('-', 'l', "list", 0, 10),
SCC_OPTPARSE_OPT('-', 'c', "count", 1, 3),
SCC_OPTPARSE_OPT_END(),
};
@@ -528,7 +528,7 @@ void test_non_dash_prefix(void) {
scc_optparse_result_t res;
static scc_optparse_opt_t custom_opts[] = {
SCC_OPTPARSE_OPT('/', 'h', "help", 0, 0, NULL, NULL),
SCC_OPTPARSE_OPT('/', 'h', "help", 0, 0),
SCC_OPTPARSE_OPT_END(),
};
@@ -544,33 +544,34 @@ void test_non_dash_prefix(void) {
}
// 测试22: 默认值功能测试
// TODO
void test_default_value(void) {
scc_optparse_t parser;
scc_optparse_result_t res;
// scc_optparse_t parser;
// scc_optparse_result_t res;
static scc_optparse_opt_t default_opts[] = {
SCC_OPTPARSE_OPT('-', 'o', "output", 0, 1, "default.txt", NULL),
SCC_OPTPARSE_OPT_END(),
};
// static scc_optparse_opt_t default_opts[] = {
// SCC_OPTPARSE_OPT('-', 'o', "output", 0, 1, "default.txt", NULL),
// SCC_OPTPARSE_OPT_END(),
// };
// 测试1: 不提供选项,应该有默认值
const char *argv1[] = {"program"};
INIT_OPTPARSE(argv1);
parser.opts = default_opts;
// // 测试1: 不提供选项,应该有默认值
// const char *argv1[] = {"program"};
// INIT_OPTPARSE(argv1);
// parser.opts = default_opts;
scc_optparse_parse(&parser, &res);
// 注意:这个测试需要修改解析器以支持默认值
// 当前实现不支持,所以只是演示
// scc_optparse_parse(&parser, &res);
// // 注意:这个测试需要修改解析器以支持默认值
// // 当前实现不支持,所以只是演示
// 测试2: 提供选项但没有值,应该使用默认值
const char *argv2[] = {"program", "-o"};
INIT_OPTPARSE(argv2);
parser.opts = default_opts;
// // 测试2: 提供选项但没有值,应该使用默认值
// const char *argv2[] = {"program", "-o"};
// INIT_OPTPARSE(argv2);
// parser.opts = default_opts;
scc_optparse_parse(&parser, &res);
TEST_CHECK(res.error == SCC_OPT_ERROR_NONE);
TEST_CHECK(res.opt && res.opt->short_name == 'o');
// 这里可以检查默认值,但当前实现不支持
// scc_optparse_parse(&parser, &res);
// TEST_CHECK(res.error == SCC_OPT_ERROR_NONE);
// TEST_CHECK(res.opt && res.opt->short_name == 'o');
// // 这里可以检查默认值,但当前实现不支持
}
// 测试23: 回调函数测试
@@ -579,13 +580,13 @@ static void test_callback(void *value) {
(void)value;
callback_called = 1;
}
// TODO
void test_callback_function(void) {
scc_optparse_t parser;
scc_optparse_result_t res;
static scc_optparse_opt_t callback_opts[] = {
SCC_OPTPARSE_OPT('-', 'h', "help", 0, 0, NULL, test_callback),
SCC_OPTPARSE_OPT('-', 'h', "help", 0, 0),
SCC_OPTPARSE_OPT_END(),
};
@@ -599,11 +600,11 @@ void test_callback_function(void) {
TEST_CHECK(res.error == SCC_OPT_ERROR_NONE);
TEST_CHECK(res.opt && strcmp(res.opt->long_name, "help") == 0);
// 调用回调函数
if (res.opt->invoke) {
res.opt->invoke(NULL);
TEST_CHECK(callback_called == 1);
}
// // 调用回调函数
// if (res.opt->invoke) {
// res.opt->invoke(NULL);
// TEST_CHECK(callback_called == 1);
// }
}
// 测试24: 复杂的短选项组合