let s:t_number = type(0)

function! gina#custom#command#option(scheme, query, ...) abort
  if a:query !~# '^--\?\S\+\%(|--\?\S\+\)*$'
    throw gina#core#revelator#error(
          \ 'Invalid query. See :h gina#custom#command#option'
          \)
  endif
  let value = get(a:000, 0, 1)
  let remover = type(value) == s:t_number ? s:build_remover(a:query) : ''
  let preference = gina#custom#preference(a:scheme, 0)
  call add(preference.command.options, [a:query, value, remover])
endfunction

function! gina#custom#command#alias(scheme, alias, ...) abort
  if a:scheme =~# '^/'
    throw gina#core#revelator#error(
          \ '/{pattern} cannot be used to define a command alias'
          \)
  endif
  let preference = gina#custom#preference(a:alias, 0)
  let preference.command.origin = a:scheme
  let preference.command.raw = get(a:000, 0, 0)
endfunction


" Private --------------------------------------------------------------------
function! s:build_remover(query) abort
  let terms = split(a:query, '|')
  let names = map(copy(terms), 'matchstr(v:val, ''^--\?\zs\S\+'')')
  let remover = map(
        \ range(len(terms)),
        \ '(terms[v:val] =~# ''^--'' ? ''--no-'' : ''-!'') . names[v:val]'
        \)
  return join(remover, '|')
endfunction