X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/7a654f8d43fdb43d78b63d90528bed6e86b608cc..3789b528d8dd8aad4558e38e22d775bcab1cbd36:/jsbuilder/src/Cli.js diff --git a/jsbuilder/src/Cli.js b/jsbuilder/src/Cli.js new file mode 100644 index 00000000..3ab7d0d5 --- /dev/null +++ b/jsbuilder/src/Cli.js @@ -0,0 +1,140 @@ +Cli = Ext.extend(Object, { + map: { + h: { + name: 'help', + desc: 'Prints this help display' + } + }, + + // Override this on a subclass of Cli. + // An array with a description on how to use this Cli. + // Each entry in the array is printed on a new line. + usage: [], + + constructor : function() { + if (this.map !== this.superproto.map) { + this.map = Ext.apply({}, this.map, this.superproto.map); + } + + this.initArguments(); + + try { + this.run(); + } + catch (e) { + Logger.log(e); + if (e.stack) { + Logger.log('\n' + 'Stack trace:\n' + e.stack); + } + } + }, + + initArguments : function() { + var args = system.arguments, + ln = args.length, + parsedArgs = this.args = {}, + curArg = null, + i, arg; + + for (i = 0; i < ln; i++) { + arg = args[i]; + if (arg[0] == '-') { + if (arg[1] == '-') { + curArg = arg.substr(2); + } + else if (arg.length == 2) { + curArg = this.map[arg[1]] ? this.map[arg[1]].name : arg[1]; + } + else { + continue; + } + + if (args[i + 1] && args[i + 1][0] != '-') { + parsedArgs[curArg] = args[i + 1] || true; + i++; + } + else { + parsedArgs[curArg] = true; + } + } + } + }, + + printUsage : function(message) { + var map = this.map, + usage = [''], + i, mapping; + + if (!message) { + usage.push(this.name + ' version ' + this.version); + usage.push('Powered by Sencha Inc'); + usage.push(''); + usage.push('Available arguments:'); + for (i in map) { + mapping = map[i]; + usage.push( + ' --' + mapping.name + ' -' + i + ); + usage.push(' ' + (mapping.required ? '(required)' : '(optional)') + ' ' + (mapping.desc || '')); + usage.push(''); + } + } + else { + usage.push(message); + } + + usage.push(''); + usage = usage.concat(this.usage); + usage.push(''); + + for (i = 0; i < usage.length; i++) { + Logger.log(usage[i]); + } + }, + + checkRequired : function() { + var args = this.args, + i, req; + + for (i in this.map) { + if (this.map[i].required && args[this.map[i].name] === undefined) { + return i; + } + } + + return true; + }, + + run : function() { + if (this.get('help')) { + this.printUsage(); + return false; + } + + var required = this.checkRequired(); + if (required !== true) { + this.error('The --' + this.map[required].name + ' or -' + required + ' argument is required'); + this.printUsage(); + return false; + } + }, + + get : function(key) { + return this.args[key] || false; + }, + + set : function(key, value, ifNotExists) { + if (ifNotExists && this.get(key) !== false) { + return; + } + this.args[key] = value; + }, + + log : function(variable) { + Logger.log(variable); + }, + + error : function(error) { + throw error; + } +}); \ No newline at end of file