Skip to content

Commit

Permalink
Add a function for parsing command args
Browse files Browse the repository at this point in the history
  • Loading branch information
w0rp committed Feb 7, 2019
1 parent 2885c57 commit 19cc724
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 0 deletions.
43 changes: 43 additions & 0 deletions autoload/ale/args.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: This module implements a function for parsing arguments for
" commands.

" Given a list of valid arguments like ['foo', 'bar'] and a string to parse,
" parse the arguments from the string and return [parsed_args, remainder].
"
" Arguments must be prefixed in the string with a single minus (-), and a
" double minus (--) denotes the end of arguments.
function! ale#args#Parse(arg_list, string) abort
let l:parsed = {}
let l:end_of_args = 0
let l:word_list = split(a:string, ' ')
let l:index = 0

while l:index < len(l:word_list)
let l:word = l:word_list[l:index]

if l:word[:0] is# '-'
let l:index += 1

if l:word is# '--'
break
endif

let l:arg = l:word[1:]

if index(a:arg_list, l:arg) >= 0
let l:parsed[l:arg] = ''
else
throw 'Invalid argument: ' . l:word
endif
elseif l:word is# ''
let l:index += 1
else
break
endif
endwhile

let l:new_string = join(l:word_list[l:index :], ' ')

return [l:parsed, l:new_string]
endfunction
52 changes: 52 additions & 0 deletions test/test_parse_command_args.vader
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
After:
unlet! b:parse_result

if exists(':ParseTest')
delcommand ParseTest
endif

Execute(ale#args#Parse should handle empty input):
AssertEqual
\ [{}, ''],
\ ale#args#Parse([], '')
AssertEqual
\ [{}, ''],
\ ale#args#Parse(['foo', 'bar'], '')

Execute(ale#args#Parse should parse commands correctly):
AssertEqual
\ [{'foo': '', 'bar': ''}, 'leave these alone'],
\ ale#args#Parse(['foo', 'bar'], '-foo -bar leave these alone')
AssertEqual
\ [{'foo': ''}, 'leave these alone'],
\ ale#args#Parse(['foo', 'bar'], '-foo leave these alone')

Execute(ale#args#Parse should raise errors for unknown arguments):
AssertThrows call ale#args#Parse(['foo', 'bar'], '-nope leave these alone')
AssertEqual 'Invalid argument: -nope', g:vader_exception

Execute(ale#args#Parse should stop parsing arguments after --):
AssertEqual
\ [{'foo': ''}, ' --nope leave these alone'],
\ ale#args#Parse(['foo', 'bar'], '-foo -- --nope leave these alone')
AssertEqual
\ [{}, '--'],
\ ale#args#Parse(['foo', 'bar'], '-- --')
AssertEqual
\ [{}, ''],
\ ale#args#Parse(['foo', 'bar'], '--')

Execute(ale#args#Parse should work for an example command):
command! -nargs=* ParseTest let b:parse_result = ale#args#Parse(['foo', 'bar'], <q-args>)

ParseTest
AssertEqual [{}, ''], b:parse_result

ParseTest -foo
AssertEqual [{'foo': ''}, ''], b:parse_result

ParseTest -foo -bar
AssertEqual [{'foo': '', 'bar': ''}, ''], b:parse_result

ParseTest -foo -bar leave these alone
AssertEqual [{'foo': '', 'bar': ''}, 'leave these alone'], b:parse_result

0 comments on commit 19cc724

Please sign in to comment.