experimenting with parser chaining....

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2020-08-25 19:12:21 +03:00
parent d1be185187
commit 4bfc2b19de
3 changed files with 60 additions and 1 deletions

View File

@ -1155,7 +1155,14 @@ object.Constructor('Parser', {
|| parsed.handler(dfl)[1] || parsed.handler(dfl)[1]
// no handler found and '-*' or '@*' not defined... // no handler found and '-*' or '@*' not defined...
if(handler == null){ if(handler == null){
throw ParserError(`Unknown ${ type == 'opt' ? 'option' : 'command:' } $ARG`, arg) } // XXX if nether the whole arg nor it split are found
// we need to push the original to unhandled...
console.log('!!!!!!!!!!!!!!!!!!!!!', arg)
unhandled.push(arg)
continue }
//throw module.ParserError(
// `Unknown ${ type == 'opt' ? 'option' : 'command:' } $ARG`,
// arg) }
// mark/unmark handlers... // mark/unmark handlers...
values.delete(handler) values.delete(handler)

47
examples/chain.js Normal file
View File

@ -0,0 +1,47 @@
#!/usr/bin/env node
var argv = require('../argv')
// XXX chaining parsers...
// what we need:
// - go through all the argv and handle specific args...
// - handle the rest of the args...
// ways to implement this:
// - parser chaining (external)
// - define a parser with -* and @* undefined
// - .then(..) calls the next parser on the unprocessed args
// ...modular but not sure how to document this...
// - parser chaining (internal)
// - root parser has -* and @* undefined
// - .then(..) calls a special command/arg/group that parser
// the rest of the args...
// ...this can be implemented as a special method/command
// something like .next(..) or .handleRest(..)
// - .chain(<parser>)
//
var parser =
exports.parser =
argv.Parser({
// XXX can we go without this???
splitOptions: false,
'-help': undefined,
'-*': undefined,
})
// XXX this works but we still need:
// - threading back the results
// - -help
// XXX would also be interesting to be able to route to specific
// chained parsers...
.then(argv.Parser({
'-moo': {
handler: function(){
console.log('MOO!!!') }},
}))
// run the parser...
__filename == (require.main || {}).filename
&& parser(process.argv)
// vim:set ts=4 sw=4 spell :

View File

@ -32,6 +32,8 @@ test.Setups({
return require('./examples/options').parser }, return require('./examples/options').parser },
lang: function(){ lang: function(){
return require('./examples/lang').parser }, return require('./examples/lang').parser },
chain: function(){
return require('./examples/chain').parser },
// NOTE: this will also load .bare, .options and .lang // NOTE: this will also load .bare, .options and .lang
basic: function(assert){ basic: function(assert){
@ -45,6 +47,8 @@ test.Setups({
console.log('>>> VERBOSE:', ...arguments) console.log('>>> VERBOSE:', ...arguments)
return 'verbose' }, return 'verbose' },
'-blank': {},
'-c': '@command', '-c': '@command',
'@cmd': '@command', '@cmd': '@command',
'@command': { '@command': {
@ -173,6 +177,7 @@ test.Setups({
'@bare': setups.bare(assert), '@bare': setups.bare(assert),
'@opts': setups.options(assert), '@opts': setups.options(assert),
'@lang': setups.lang(assert), '@lang': setups.lang(assert),
'@chain': setups.chain(assert),
// collision test... // collision test...