ph-dev-tools
Version:
Development Tools for PHibernate
73 lines (61 loc) • 1.75 kB
text/typescript
/**
* Created by Papa on 4/24/2016.
*/
import {ARGUMENT_FLAGS, ArgumentType, Flags} from "./Arguments";
export function parseFlags(
programArguments:string[]
):Flags {
let flags:Flags = new Flags();
let argumentGroups:string[][] = getArgumentGroups(programArguments);
let foundFlags:{[argumentType:number]:boolean} = {};
argumentGroups.forEach((
argumentGroup:string[]
) => {
let flag = argumentGroup[0];
let argType:ArgumentType = ARGUMENT_FLAGS[flag];
switch(argType) {
case ArgumentType.CONFIG:
if(foundFlags[argType]) {
throw `Flag already specified '${flag}'`;
}
verifyArgumentGroupLength(argumentGroup, 2);
foundFlags[argType] = true;
flags.optionsFilePath = argumentGroup[1];
default:
throw `Unexpected flag '${flag}'`;
}
});
if(!flags.optionsFilePath) {
flags.optionsFilePath = 'phconfig.json';
}
return flags;
}
function verifyArgumentGroupLength(
argumentGroup:string[],
expectedLength:number
):void {
if(argumentGroup.length !== expectedLength) {
throw `Expecting '${expectedLength - 1}' values for '${argumentGroup[0]}' flag`;
}
}
function getArgumentGroups(
programArguments:string[]
):string[][] {
let optionGroups:string[][] = [];
let currentOptionGroup:string[];
for (let i = 2; i < programArguments.length; i++) {
let currentArgument = programArguments[i];
// we have a new option
if (currentArgument.indexOf('-') === 0) {
if (currentOptionGroup) {
optionGroups.push(currentOptionGroup);
}
currentOptionGroup = [];
}
currentOptionGroup.push(currentArgument);
}
if (currentOptionGroup) {
optionGroups.push(currentOptionGroup);
}
return optionGroups;
}