--- /dev/null
+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