mirror of
				https://github.com/flynx/argv.js.git
				synced 2025-10-29 18:50:09 +00:00 
			
		
		
		
	more refactoring and cleanup...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									78d1e2a7be
								
							
						
					
					
						commit
						f6758f6b7f
					
				
							
								
								
									
										55
									
								
								argv.js
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								argv.js
									
									
									
									
									
								
							| @ -339,6 +339,8 @@ function(spec){ | ||||
| // 	}
 | ||||
| //
 | ||||
| //
 | ||||
| // XXX should .options(..), .commands(..) and .handler(..) be:
 | ||||
| // 		.getOptions(..), .getCommands(..) and .getHandler(..) respectively???
 | ||||
| // XXX should we handle <scriptName>-<command> script calls???
 | ||||
| var Parser = | ||||
| module.Parser = | ||||
| @ -347,11 +349,14 @@ object.Constructor('Parser', { | ||||
| 	optionPrefix: '-', | ||||
| 	commandPrefix: '@', | ||||
| 	 | ||||
| 	// NOTE: we only care about differentiating an option from a command
 | ||||
| 	// 		here by design...
 | ||||
| 	optionInputPattern: /^--?(.*)$/, | ||||
| 	commandInputPattern: /^([a-zA-Z].*)$/, | ||||
| 
 | ||||
| 
 | ||||
| 	// instance stuff...
 | ||||
| 	// XXX revise...
 | ||||
| 	argv: null, | ||||
| 	rest: null, | ||||
| 	scriptNmae: null, | ||||
| @ -367,7 +372,6 @@ object.Constructor('Parser', { | ||||
| 	// 	]
 | ||||
| 	//
 | ||||
| 	// XXX add option groups...
 | ||||
| 	// XXX should these be .getOptions(..) / .getCommands(..) ???
 | ||||
| 	options: function(...prefix){ | ||||
| 		var that = this | ||||
| 		prefix = prefix.length == 0 ? | ||||
| @ -380,7 +384,7 @@ object.Constructor('Parser', { | ||||
| 					.forEach(function(opt){ | ||||
| 						if(!opt.startsWith(prefix)){ | ||||
| 							return } | ||||
| 						var [k, h] = that.getHandler(opt) | ||||
| 						var [k, h] = that.handler(opt) | ||||
| 						h !== undefined | ||||
| 							&& (handlers[k] ? | ||||
| 								handlers[k][0].push(opt) | ||||
| @ -409,7 +413,8 @@ object.Constructor('Parser', { | ||||
| 
 | ||||
| 	// NOTE: this ignores options forming alias loops and dead-end 
 | ||||
| 	// 		options...
 | ||||
| 	getHandler: function(key){ | ||||
| 	handler: function(key){ | ||||
| 		var value | ||||
| 		key = this.optionInputPattern.test(key) ? | ||||
| 			key.replace(this.optionInputPattern, this.optionPrefix+'$1') | ||||
| 			: key.replace(this.commandInputPattern, this.commandPrefix+'$1') | ||||
| @ -527,8 +532,6 @@ object.Constructor('Parser', { | ||||
| 						: e }) | ||||
| 				.flat() | ||||
| 				.join('\n'))) | ||||
| 
 | ||||
| 			// XXX should we explicitly exit here or in the runner???
 | ||||
| 			return module.STOP }}, | ||||
| 
 | ||||
| 	// common short-hands...
 | ||||
| @ -539,6 +542,7 @@ object.Constructor('Parser', { | ||||
| 	'-verbose': '-v', | ||||
| 
 | ||||
| 
 | ||||
| 	// Handle arguments with no explicit handlers found...
 | ||||
| 	//
 | ||||
| 	// 	Handle dynamic/unknown argument...
 | ||||
| 	// 	.handleArgument(args, arg)
 | ||||
| @ -566,11 +570,26 @@ object.Constructor('Parser', { | ||||
| 		console.error('Unknown '+ (key.startsWith('-') ? 'option:' : 'command:'), key) | ||||
| 		return module.ERROR },  | ||||
| 
 | ||||
| 	// NOTE: if this is set to false Parser will not call process.exit(..)
 | ||||
| 	// Handle argument value conversion...
 | ||||
| 	//
 | ||||
| 	// If this is false/undefined value is passed to the handler as-is...
 | ||||
| 	//
 | ||||
| 	// Example:
 | ||||
| 	//		handleArgumentValue: function(handler, value){
 | ||||
| 	//			// process handler value type definition or infer type 
 | ||||
| 	//			// and convert...
 | ||||
| 	//			return value },
 | ||||
| 	handleArgumentValue: false, | ||||
| 
 | ||||
| 	// Handle error exit...
 | ||||
| 	//
 | ||||
| 	// If this is set to false Parser will not call process.exit(..) on 
 | ||||
| 	// error...
 | ||||
| 	handleErrorExit: function(arg){ | ||||
| 		process.exit(1) }, | ||||
| 
 | ||||
| 	// post parsing callbacks...
 | ||||
| 	//
 | ||||
| 	then: afterCallback('parsing'), | ||||
| 	stop: afterCallback('stop'), | ||||
| 	error: afterCallback('error'), | ||||
| @ -581,6 +600,8 @@ object.Constructor('Parser', { | ||||
| 	//
 | ||||
| 	// NOTE: this (i.e. parser) can be used as a nested command/option 
 | ||||
| 	// 		handler...
 | ||||
| 	//
 | ||||
| 	// XXX ARGV: need to normalize argv -- strip out the interpreter if it is given...
 | ||||
| 	__call__: function(context, argv){ | ||||
| 		var that = this | ||||
| 		var nested = false | ||||
| @ -589,8 +610,7 @@ object.Constructor('Parser', { | ||||
| 		argv = argv == null ? | ||||
| 			process.argv.slice() | ||||
| 			: argv | ||||
| 		// XXX need to normalize argv...
 | ||||
| 		// XXX ...strip out the interpreter if it is given...
 | ||||
| 		// XXX ARGV: strip out the interpreter if it is given...
 | ||||
| 
 | ||||
| 		// nested command handler...
 | ||||
| 		// XXX the condition is a bit too strong...
 | ||||
| @ -605,7 +625,7 @@ object.Constructor('Parser', { | ||||
| 		} else { | ||||
| 			var rest = this.rest = argv.slice() | ||||
| 			this.argv = argv.slice() | ||||
| 			// XXX revise this...
 | ||||
| 			// XXX ARGV: revise this...
 | ||||
| 			// 		- when run from node -- [<node>, <script>, ...]
 | ||||
| 			// 		- when run from electron -- [<electron>, ...]
 | ||||
| 			// 			require('electron').remove.process.argv
 | ||||
| @ -618,7 +638,7 @@ object.Constructor('Parser', { | ||||
| 
 | ||||
| 		var unhandled = [] | ||||
| 		while(argv.length > 0){ | ||||
| 			var arg = argv.shift() | ||||
| 			var [arg, value] = argv.shift().split(/=/) | ||||
| 			var type = opt_pattern.test(arg) ? | ||||
| 					'opt' | ||||
| 				: this.isCommand(arg) ? | ||||
| @ -627,12 +647,17 @@ object.Constructor('Parser', { | ||||
| 			// options / commands...
 | ||||
| 			if(type != 'unhandled'){ | ||||
| 				// get handler...
 | ||||
| 				var handler = this.getHandler(arg)[1] | ||||
| 				var handler = this.handler(arg)[1] | ||||
| 						|| this.handleArgument | ||||
| 				// get option value...
 | ||||
| 				var value = (handler.arg && !opt_pattern.test(argv[0])) ? | ||||
| 				value = value  | ||||
| 					|| ((handler.arg && !opt_pattern.test(argv[0])) ? | ||||
| 							argv.shift() | ||||
| 					: undefined | ||||
| 						: undefined) | ||||
| 				// value conversion...
 | ||||
| 				value = value && this.handleArgumentValue ? | ||||
| 					this.handleArgumentValue(handler, value) | ||||
| 					: value | ||||
| 				// run handler...
 | ||||
| 				var res = (typeof(handler) == 'function' ? | ||||
| 						handler | ||||
| @ -640,7 +665,7 @@ object.Constructor('Parser', { | ||||
| 					.call(this,  | ||||
| 						argv, | ||||
| 						arg, | ||||
| 						...(handler.arg ? [value] : [])) | ||||
| 						...(value ? [value] : [])) | ||||
| 				// handle .STOP / .ERROR
 | ||||
| 				if(res === module.STOP || res === module.ERROR){ | ||||
| 					afterCallbackCall( | ||||
| @ -669,4 +694,4 @@ object.Constructor('Parser', { | ||||
| 
 | ||||
| 
 | ||||
| /********************************************************************** | ||||
| * vim:set ts=4 sw=4 :                               */ return module }) | ||||
| * vim:set ts=4 sw=4 nowrap :                        */ return module }) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user