Upgrade to ExtJS 4.0.1 - Released 05/18/2011
[extjs.git] / jsbuilder / src / Cli.js
1 Cli = Ext.extend(Object, {
2     map: {
3         h: {
4             name: 'help',
5             desc: 'Prints this help display'
6         }
7     },
8
9     // Override this on a subclass of Cli.
10     // An array with a description on how to use this Cli.
11     // Each entry in the array is printed on a new line.
12     usage: [],
13     
14     constructor : function() {
15         if (this.map !== this.superproto.map) {
16             this.map = Ext.apply({}, this.map, this.superproto.map);
17         }
18         
19         this.initArguments();
20         
21         try {
22             this.run();
23         }
24         catch (e) {
25             Logger.log(e);
26             if (e.stack) {
27                 Logger.log('\n' + 'Stack trace:\n' + e.stack);
28             }
29         }
30     },
31     
32     initArguments : function() {
33         var args = system.arguments,
34             ln = args.length,
35             parsedArgs = this.args = {},
36             curArg = null,
37             i, arg;
38
39         for (i = 0; i < ln; i++) {
40             arg = args[i];
41             if (arg[0] == '-') {
42                 if (arg[1] == '-') {
43                     curArg = arg.substr(2);
44                 }
45                 else if (arg.length == 2) {
46                     curArg = this.map[arg[1]] ? this.map[arg[1]].name : arg[1];
47                 }
48                 else {
49                     continue;
50                 }
51
52                 if (args[i + 1] && args[i + 1][0] != '-') {
53                     parsedArgs[curArg] = args[i + 1] || true;
54                     i++;
55                 }
56                 else {
57                     parsedArgs[curArg] = true;
58                 }
59             }
60         }
61     },
62     
63     printUsage : function(message) {
64         var map = this.map,
65             usage = [''],
66             i, mapping;
67         
68         if (!message) {
69             usage.push(this.name + ' version ' + this.version);
70             usage.push('Powered by Sencha Inc');
71             usage.push('');
72             usage.push('Available arguments:');
73             for (i in map) {
74                 mapping = map[i];
75                 usage.push(
76                     '    --' + mapping.name + '  -' + i
77                 );
78                 usage.push('      ' + (mapping.required ? '(required)' : '(optional)') + ' ' + (mapping.desc || ''));
79                 usage.push('');
80             }
81         }
82         else {
83             usage.push(message);
84         }
85         
86         usage.push('');
87         usage = usage.concat(this.usage);
88         usage.push('');
89
90         for (i = 0; i < usage.length; i++) {
91             Logger.log(usage[i]);
92         }
93     },
94     
95     checkRequired : function() {
96         var args = this.args,
97             i, req;
98         
99         for (i in this.map) {
100             if (this.map[i].required && args[this.map[i].name] === undefined) {
101                 return i;
102             }
103         }
104         
105         return true;
106     },
107     
108     run : function() {
109         if (this.get('help')) {
110             this.printUsage();
111             return false;            
112         }
113         
114         var required = this.checkRequired();
115         if (required !== true) {
116             this.error('The --' + this.map[required].name + ' or -' + required + ' argument is required');
117             this.printUsage();
118             return false;
119         }
120     },
121     
122     get : function(key) {
123         return this.args[key] || false;
124     },
125     
126     set : function(key, value, ifNotExists) {
127         if (ifNotExists && this.get(key) !== false) {
128             return;
129         }
130         this.args[key] = value;
131     },
132     
133     log : function(variable) {
134         Logger.log(variable);
135     },
136     
137     error : function(error) {
138         throw error;
139     }
140 });