complete_value(value_description, partial, is_param)
click to toggle source
def complete_value(value_description, partial, is_param)
case value_description[:type]
when :value
if !partial.empty?
[]
elsif is_param
['--->', 'Add parameter']
else
['--->', 'Add option <value>']
end
when :directory
directories(partial)
when :file
files(partial, value_description)
end
end
directories(partial = '')
click to toggle source
def directories(partial = '')
dirs = []
dirs += Dir.glob("#{partial}*").select { |f| File.directory?(f) }
dirs = dirs.map { |d| d + '/' } if dirs.length == 1
dirs
end
files(partial = '', opts = {})
click to toggle source
def files(partial = '', opts = {})
filter = opts.fetch(:filter, '.*')
file_names = []
file_names += Dir.glob("#{partial}*").select do |f|
File.directory?(f) || f =~ /#{filter}/
end
file_names.map { |f| File.directory?(f) ? f + '/' : f + ' ' }
end
finish_option_or_subcommand(dict, incomplete)
click to toggle source
def finish_option_or_subcommand(dict, incomplete)
dict.keys.select { |k| k.is_a?(String) && k =~ /^#{incomplete}/ }.map { |k| k + ' ' }
end
finish_option_value(dict, incomplete)
click to toggle source
def finish_option_value(dict, incomplete)
complete_value(dict, incomplete, false) if dict.key?(:type)
end
finish_param(dict, incomplete)
click to toggle source
def finish_param(dict, incomplete)
if dict[:params] && !dict[:params].empty?
complete_value(dict[:params].first, incomplete, true)
else
[]
end
end
finish_word(dict, incomplete)
click to toggle source
def finish_word(dict, incomplete)
finish_option_value(dict, incomplete) ||
(finish_option_or_subcommand(dict, incomplete) + finish_param(dict, incomplete))
end
parse_option(dict, path)
click to toggle source
def parse_option(dict, path)
if dict[path.first][:type] == :flag
traverse_tree(dict, path[1..-1])
elsif path.length >= 2
traverse_tree(dict, path[2..-1])
else
[dict[path.first], path[1..-1]]
end
end
parse_params(dict, path)
click to toggle source
def parse_params(dict, path)
traverse_tree({ :params => dict[:params][1..-1] }, path[1..-1])
end
parse_subcommand(dict, path)
click to toggle source
def parse_subcommand(dict, path)
traverse_tree(dict[path.first], path[1..-1])
end
traverse_tree(dict, path)
click to toggle source
def traverse_tree(dict, path)
return [dict, []] if path.nil? || path.empty?
result = if dict.key?(path.first)
if path.first.start_with?('-')
parse_option(dict, path)
else
parse_subcommand(dict, path)
end
elsif dict[:params]
parse_params(dict, path)
else
[{}, path]
end
result
end