W ramach ćwiczenia tworzymy mechanizm parsowania argv przekazywanych do CLI. Do dzieła.
Najpierw musimy wiedzieć, czy argument jest nazwany czy nie:
function isNamedArg(arg){
return arg.startsWith("--") && arg.includes("=");
}
Tak to wygląda:
const process = require('process');
var args = process.argv;
console.log(`number of arguments is ${args.length - 2}`);
args.forEach((val, index) => {
if(index >= 2){
console.log(`${index-1}: ${val}`);
console.log(isNamedArg(val));
}
});
function isNamedArg(arg){
return arg.startsWith("--") && arg.includes("=");
}
// node .\argsy2.js "blabla bla" --named=namedArg
// number of arguments is 2
// 1: blabla bla
// false
// 2: --named=namedArg
// true
Niestety w pętli forEach nie można korzystać z continue/break (de facto to jest funkcja nie pętla) więc nasz kod nie będzie najpiękniejszy:
function getArgs(){
let arguments = {
named: [],
simple: []
};
process.argv.forEach((val, index)=> {
if(index>=2){
if(!isNamedArg(val)){
arguments.simple.push(val);
}
else{
const [argName, argVal] = val.split("=")
const namedArg = {
name: argName.slice(2),
value: argVal
}
arguments.named.push(namedArg);
}
}
});
return arguments;
}
Jeszcze ta nazwa arguments – wbudowaną zmienną przykrywa, ale ok, chodzi o przykład:
const process = require('process');
var args = process.argv;
console.log(`number of arguments is ${args.length - 2}`);
function isNamedArg(arg){
return arg.startsWith("--") && arg.includes("=");
}
function getArgs(){
let arguments = {
named: [],
simple: []
};
process.argv.forEach((val, index)=> {
if(index>=2){
if(!isNamedArg(val)){
arguments.simple.push(val);
}
else{
const [argName, argVal] = val.split("=")
const namedArg = {
name: argName.slice(2),
value: argVal
}
arguments.named.push(namedArg);
}
}
});
return arguments;
}
let argsy = getArgs();
console.log(argsy);
// >node .\argsy2.js "blabla bla" --named=namedArg
// number of arguments is 2
// {
// named: [ { name: 'named', value: 'namedArg' } ],
// simple: [ 'blabla bla' ]
// }
Dalej już sobie raczej poradzimy, albo skorzystamy z gotowych bibliotek do pracy z CLI.