应用同一标志的多个实例时进行自定义操作字符串解析



我有一个命令行程序,我想在其中生成一个给定多个参数的图片,其中参数的顺序应该得到尊重,并且允许重复的参数

有没有任何node.js optstring解析器可以实现这一点?

我想要一些类似的东西

generate_picture --red 100 --yellow 200 --red 100 --width 500

然后它生成一个";标志";顶部有一个红色的100px带,然后是一个200px的黄色带,然后又是一个100px的红色带,所有这些都应用了宽度为500px的

我的程序并没有真正做到这一点,但它类似于

我认为我的程序接收这些参数的理想形式是像这样的数组数组

[
['red', 100],
['yellow', 200],
['red', 100],
['width', 500]
]

我可能会提前扫描这个阵列,寻找我希望只应用一次的东西,比如宽度

我想现在我已经把它写出来了,手动解析process.argv数组使其进入这种状态可能不会太难,但很好奇是否已经有任何可用的选项

为了帮助我的特殊情况,我制作了这个实用程序函数

function parseArgv(argv) {
const map = [];
while (argv.length) {
const val = argv[0].slice(2);
argv = argv.slice(1);
const next = argv.findIndex((arg) => arg.startsWith("-"));
if (next !== -1) {
map.push([val, argv.slice(0, next)]);
argv = argv.slice(next);
} else {
map.push([val, argv]);
break;
}
}
return map;
}

示例用法

test("parse", () => {
expect(
parseArgv(
"--bam file1.bam color:red --vcf variants.vcf --bam file2.bam --defaultSession --out out.svg --fullSvg".split(
" "
)
)
).toEqual([
["bam", ["file1.bam", "color:red"]],
["vcf", ["variants.vcf"]],
["bam", ["file2.bam"]],
["defaultSession", []],
["out", ["out.svg"]],
["fullSvg", []],
]);
});

然后,后处理可以对此有更多的意义,但这个实用程序函数对我的目的很有帮助,这是用yargs或其他节点optstring解析器无法实现的

最新更新