Иван обнови решението на 04.11.2016 07:43 (преди около 8 години)
+module CustomParser
+ def parse_argument(runner, arguments, hash, index)
+ hash[hash.keys[index]] = arguments
+ runner.merge! hash
+ end
+
+ def parse_option(runner, hash)
+ runner.merge! hash
+ end
+
+ def parse_option_with_param(runner, argument, hash, index)
+ hash[hash.keys[index]] = argument.slice(
+ argument.index('=') + 1,
+ argument.length
+ ).to_s
+ runner.merge! hash
+ end
+
+ def an_option?(arguments)
+ arguments.include? '-'
+ end
+
+ def an_option_with_parameter?(arguments)
+ arguments.include? '='
+ end
+
+ def add_argument(runner, arguments)
+ # arg_keys = runner.keys
+ arguments.each_index do |i|
+ check_argument(runner, arguments[i], i)
+ end
+ end
+
+ def check_argument(runner, argument, index)
+ if an_option_with_parameter?(argument)
+ parse_option_with_param(runner, argument, @arguments, index)
+ elsif an_option?(argument)
+ parse_option(runner, @options)
+ else
+ parse_argument(runner, argument, @arguments, index)
+ end
+ end
+end
+
+module CommandParserHelper
+end
+
+class CommandParser
+ include CustomParser
+ include CommandParserHelper
+
+ def initialize(command_name)
+ @name = command_name
+ @options = {}
+ @arguments = {}
+ @argv = []
+ @runner
+ end
+
+ def parse(command_runner, arguments = [])
+
+ add_argument(command_runner, arguments)
+
+ end
+
+ def argument(name)
+ @argv.push name
+ yield(@arguments, name)
+ end
+
+ def option(short, full, description)
+ @argv.push [short, full, description]
+ # Вторият аргумент на блока - value - винаги трябва да има стойност true
+ yield(@options, true)
Това ок ли е? Правилно ли интерпретирам коментара от условието?
p.s. отговорих си на поредния глупав въпрос... Реално това важи за helper-a и ако на command_runner подадем опция, то тогава тя е true... Просто съм се надъхал, а някои неща са ми малко объркващи. Извинявайте за спам-а xD
+ end
+
+ def option_with_parameter(short, full, description, parameter)
+ @argv.push [short, full, description, parameter]
+ yield(@arguments, parameter)
+ end
+
+ def help
+ puts "Usage: HELP "
+ output = "Usage: " + @name
+ output
+ end
+
+ def to_s
+ @arguments
+ end
+end
Това ок ли е? Правилно ли интерпретирам коментара от условието?
p.s. отговорих си на поредния глупав въпрос... Реално това важи за helper-a и ако на command_runner подадем опция, то тогава тя е true... Просто съм се надъхал, а някои неща са ми малко объркващи. Извинявайте за спам-а xD
Няма глупави въпроси. Иначе не трябва да yield-ваш при извикването на
option
, а когато се викне parse. Тук още не знаеш дали ще трябва да се викне или не. :)