ci-auto-deploy
Version:
Automatic Deployment for Continuous Delivery Pipelines
184 lines (158 loc) • 5.26 kB
JavaScript
const yaml = require('js-yaml');
function argParse(args, argDefs, mode){
try {
return parse(args, argDefs, mode)
}
catch (err){
console.error(err);
if (!err.includes('Error: Unknown parse mode')){
console.error(`Check Command Line Options :`);
console.error(`${args}`);
}
process.exit(1);
}
}
function parse (args, argDefs, mode='all') {
if (!(['all', 'defaults', 'argsonly'].includes(mode))){
throw (`Error: Unknown parse mode '${mode}' in parse function arguments.`)}
// mode: all, defaults, argsonly
const kwargs = {};
//Assign Default Values
if ((mode == 'all' || mode == 'defaults') && mode != 'argsonly'){
for (let key in argDefs.arguments) {
let argument = argDefs.arguments[key];
if ('defaultValue' in argument){
try{
const parsed = yaml.load(argument.defaultValue)
kwargs[argument.variableName] = parsed
} catch (err){
kwargs[argument.variableName] = argument.defaultValue
}
}
}
}
const { positionals } = argDefs
//let args = evalStrings(argStr || '')
//Help
if (args.includes('--help') || args.includes('-h')){
console.log(helpText(argDefs));
process.exit(0);
}
if (!args || args.length == 0){return kwargs}
if (!argDefs) {throw('No Argument Definition provided.')}
if (mode == 'defaults'){
return kwargs
}
//evaluate positional arguments
let posArgEnds = args.findIndex(v=>v.search(/^-+/)>-1);
if (posArgEnds == -1){posArgEnds = args.length}
posArgs = args.slice(0, posArgEnds)
args = args.slice(posArgEnds)
//Positional Arguments
if (posArgs.length > 0){
if (!positionals){throw('No Positional Argument Definition.');}
if (posArgs.length > positionals.length){throw('Too much positional Arguments.')}
posArgs.forEach((item ,index)=> {
const command = positionals[index]
const longCommand = argDefs.arguments[command].longCommand
args.push(`--${longCommand}`)
args.push(item)
});
}
//Keyword arguments
let cnt = 0;
// Iterate for all arguents
for (let i=0; i < args.length ; i++) {
const arg = args[i];
if (arg == ''){cnt++ ; continue;}
const isLongArgument = arg.substr(0,2) == '--'
if (!(arg[0] == '-' || isLongArgument)) continue;
//Search Args
for (let key in argDefs.arguments) {
let argument = argDefs.arguments[key];
if (isLongArgument && argument.longCommand == arg.substring(2) ||
!isLongArgument && argument.shortCommand == arg.substring(1)){
if (argument.type == 'parameter'){
let paramValue;
try {paramValue = args[i + 1]}catch (err){throw err}
if (paramValue) {
try{
const parsed = yaml.load(paramValue)
kwargs[argument.variableName] = parsed
} catch (err){
kwargs[argument.variableName] = paramValue
}
cnt += 2;
} else {
throw (`Argument ${argument.longCommand} should have a value ${argument.usage}.`)
}
} else if (argument.type == 'boolean'){
kwargs[argument.variableName] = !argument.reverse ? true : false;
cnt++
} else {
throw('Wrong Argument Definition.');
}
delete argument[key];
break;
}
}
}
//Throw error on wrong argument
if (cnt != args.length){
throw (`Could not handle All Arguments. \n ${args}`)
}
return kwargs;
}
function helpText(argDefs) {
let htxt = `${argDefs.title}\n\n`
htxt += Object.entries(argDefs.arguments).reduce((previous, current, index) => {
let line = `--${current[1].longCommand}, -${current[1].shortCommand}`
let usage = current[1].usage;
if (Array.isArray(usage)){
usage = ' [ ' + usage.join(' | ') + ' ] '
} else if (usage == null) {
let space = 25
usage = ' '.repeat((space - line.length) > 0 ? space - line.length : 5)
} else {
usage = ' ' + usage + ' '
}
return `${previous}${line}${usage}\n Definition : ${current[1].definition}\n Default Value : ${current[1].defaultValue}\n\n`
}, '')
htxt += '\nExamples: \n\n'
htxt += Object.entries(argDefs.examples).reduce((previous, current, index) => {
return `${previous}${current[1].title} : \n${current[1].example}\n\n`
},'')
return htxt
}
function evalStrings(argStr){
const arr = argStr.split(' ')
let result = [];
quoteOpen = false;
for (let i=0; i<arr.length; i++) {
if (arr[i].includes('"')){
if (quoteOpen){
if (arr[i][arr[i].length-1] == '"'){
quoteOpen = false;
result[result.length - 1] = `${result[result.length - 1]} ${arr[i].substr(0,arr[i].length - 1)}`
} else {
throw('Argument Error');
}
} else {
if (arr[i][0] == '"'){
quoteOpen = true;
result.push(arr[i].substring(1))
} else {
throw('Argument Error');
}
}
} else {
if (quoteOpen){
result[result.length - 1] = `${result[result.length - 1]} ${arr[i]}`
} else {
result.push(arr[i]);
}
}
}
return result;
}
module.exports = argParse;