aboutsummaryrefslogtreecommitdiff
path: root/lib/knapsack_solver/cli_option_parser.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/knapsack_solver/cli_option_parser.rb')
-rw-r--r--lib/knapsack_solver/cli_option_parser.rb68
1 files changed, 68 insertions, 0 deletions
diff --git a/lib/knapsack_solver/cli_option_parser.rb b/lib/knapsack_solver/cli_option_parser.rb
new file mode 100644
index 0000000..0f0720c
--- /dev/null
+++ b/lib/knapsack_solver/cli_option_parser.rb
@@ -0,0 +1,68 @@
+require 'optparse'
+require 'knapsack_solver/cli_option_checker'
+
+module KnapsackSolver
+ # This class parses command line arguments provided to the knapsack_solver
+ # binary.
+ class CliOptionParser
+ # Message that describes how to use this CLI utility.
+ USAGE_MESSAGE = 'Usage: knapsack_solver OPTIONS DATASET_FILE...'.freeze
+
+ # Parses command-line arguments and removes them from the array of
+ # arguments.
+ #
+ # @param [Array] arguments the command-line arguments.
+ # @return [Hash] hash of recognized options.
+ #
+ # rubocop:disable Metrics/AbcSize, Metric/MethodLength, Metric/BlockLength
+ def self.parse(arguments)
+ options = {}
+ parser = OptionParser.new do |opts|
+ opts.banner = USAGE_MESSAGE
+ opts.on('-b', '--branch-and-bound', 'Use branch and boung method of solving') do
+ options[:branch_and_bound] = true
+ end
+ opts.on('-d', '--dynamic-programming', 'Use dynamic programming for solving') do
+ options[:dynamic_programming] = true
+ end
+ opts.on('-f', '--fptas', 'Use FPTAS for solving') do
+ options[:fptas] = true
+ end
+ opts.on('-r', '--heuristic', 'Use brute force method of solving') do
+ options[:heuristic] = true
+ end
+ opts.on('-e', '--fptas-epsilon EPS', 'Relative error for FPTAS from range (0,1)') do |eps|
+ options[:fptas_epsilon] = eps
+ end
+ opts.on('-o', '--output DIR', 'Directory for output log files') do |dir|
+ options[:output_dir] = dir
+ end
+ opts.on('-g', '--graphs DIR', 'Directory for graphs') do |dir|
+ options[:graphs_dir] = dir
+ end
+ opts.on('-v', '--version', 'Show program version') do
+ options[:version] = true
+ end
+ opts.on_tail('-h', '--help', 'Show this help message') do
+ options[:help] = true
+ end
+ end
+ parser.parse!(arguments)
+ process_help_and_version_opts(options, arguments, parser.to_s)
+ end
+ # rubocop:enable Metrics/AbcSize, Metric/MethodLength, Metric/BlockLength
+
+ def self.process_help_and_version_opts(options, arguments, usage_msg)
+ if !options[:help] && !options[:version]
+ CliOptionChecker.check(options, arguments)
+ return options
+ end
+ if options[:help]
+ puts usage_msg
+ elsif options[:version]
+ puts "knapsack_solver #{KnapsackSolver::VERSION}"
+ end
+ nil
+ end
+ end
+end