From 0389f7fc5c54858f93d5c1254b656f6ba609a7dc Mon Sep 17 00:00:00 2001 From: kojix2 <2xijok@gmail.com> Date: Wed, 23 Sep 2020 21:32:11 +0900 Subject: [PATCH] create sub-parsers using case instead of Hash --- lib/uplot/command/parser.rb | 228 +++++++++++++++++------------------- 1 file changed, 106 insertions(+), 122 deletions(-) diff --git a/lib/uplot/command/parser.rb b/lib/uplot/command/parser.rb index 29b4181..097f094 100644 --- a/lib/uplot/command/parser.rb +++ b/lib/uplot/command/parser.rb @@ -6,12 +6,10 @@ require_relative 'params' module Uplot class Command class Parser - attr_reader :command, :params, :main_parser, :sub_parsers, + attr_reader :command, :params, :delimiter, :transpose, :headers, :output, :count, :fmt, :debug def initialize - @sub_parsers = create_sub_parsers - @main_parser = create_main_parser @command = nil @params = Params.new @@ -80,113 +78,8 @@ module Uplot end end - def create_sub_parsers - parsers = Hash.new do |h, k| - h[k] = create_default_parser do |parser| - parser.banner = <<~MSG - Usage: uplot #{k} [options] - - Options: - MSG - end - end - - parsers[:barplot] = \ - parsers[:bar] - .on('--symbol VAL', String) do |v| - params.symbol = v - end - .on('--xscale VAL', String) do |v| - params.xscale = v - end - .on('--count', TrueClass) do |v| - @count = v - end - - parsers[:count] = \ - parsers[:c] # barplot -c - .on('--symbol VAL', String) do |v| - params.symbol = v - end - - parsers[:histogram] = \ - parsers[:hist] - .on('-n', '--nbins VAL', Numeric) do |v| - params.nbins = v - end - .on('--closed VAL', String) do |v| - params.closed = v - end - .on('--symbol VAL', String) do |v| - params.symbol = v - end - - parsers[:lineplot] = \ - parsers[:line] - .on('--canvas VAL', String) do |v| - params.canvas = v - end - .on('--xlim VAL', Array) do |v| - params.xlim = v.take(2) - end - .on('--ylim VAL', Array) do |v| - params.ylim = v.take(2) - end - - parsers[:lineplots] = \ - parsers[:lines] - .on('--canvas VAL', String) do |v| - params.canvas = v - end - .on('--xlim VAL', Array) do |v| - params.xlim = v.take(2) - end - .on('--ylim VAL', Array) do |v| - params.ylim = v.take(2) - end - - parsers[:scatter] = \ - parsers[:s] - .on('--canvas VAL', String) do |v| - params.canvas = v - end - .on('--xlim VAL', Array) do |v| - params.xlim = v.take(2) - end - .on('--ylim VAL', Array) do |v| - params.ylim = v.take(2) - end - - parsers[:density] = \ - parsers[:d] - .on('--grid', TrueClass) do |v| - params.grid = v - end - .on('--xlim VAL', Array) do |v| - params.xlim = v.take(2) - end - .on('--ylim VAL', Array) do |v| - params.ylim = v.take(2) - end - - parsers[:boxplot] = \ - parsers[:box] - .on('--xlim VAL', Array) do |v| - params.xlim = v.take(2) - end - - parsers[:colors] - .on('-n', '--names', TrueClass) do |v| - @color_names = v - end - - # Preventing the generation of new sub-commands - parsers.default = nil - parsers - end - - def create_main_parser - create_default_parser do |main_parser| + def main_parser + @main_parser ||= create_default_parser do |main_parser| # Usage and help messages main_parser.banner = \ <<~MSG @@ -196,13 +89,114 @@ module Uplot Usage: uplot [options] Command: - #{sub_parsers.keys.join("\n ")} + a Options: MSG end end + def sub_parser + @sub_parser ||= create_default_parser do |parser| + parser.banner = <<~MSG + Usage: uplot #{command} [options] + + Options: + MSG + + case command + when nil + warn main_parser.help + exit 1 + + when :barplot, :bar + parser.on('--symbol VAL', String) do |v| + params.symbol = v + end + parser.on('--xscale VAL', String) do |v| + params.xscale = v + end + parser.on('--count', TrueClass) do |v| + @count = v + end + + when :count, :c + parser.on('--symbol VAL', String) do |v| + params.symbol = v + end + + when :histogram, :hist + parser.on('-n', '--nbins VAL', Numeric) do |v| + params.nbins = v + end + parser.on('--closed VAL', String) do |v| + params.closed = v + end + parser.on('--symbol VAL', String) do |v| + params.symbol = v + end + + when :lineplot, :line + parser.on('--canvas VAL', String) do |v| + params.canvas = v + end + parser.on('--xlim VAL', Array) do |v| + params.xlim = v.take(2) + end + parser.on('--ylim VAL', Array) do |v| + params.ylim = v.take(2) + end + + when :lineplots, :lines + parser.on('--canvas VAL', String) do |v| + params.canvas = v + end + parser.on('--xlim VAL', Array) do |v| + params.xlim = v.take(2) + end + parser.on('--ylim VAL', Array) do |v| + params.ylim = v.take(2) + end + + when :scatter, :s + parser.on('--canvas VAL', String) do |v| + params.canvas = v + end + parser.on('--xlim VAL', Array) do |v| + params.xlim = v.take(2) + end + parser.on('--ylim VAL', Array) do |v| + params.ylim = v.take(2) + end + + when :density, :d + parser.on('--grid', TrueClass) do |v| + params.grid = v + end + parser.on('--xlim VAL', Array) do |v| + params.xlim = v.take(2) + end + parser.on('--ylim VAL', Array) do |v| + params.ylim = v.take(2) + end + + when :boxplot, :box + parser.on('--xlim VAL', Array) do |v| + params.xlim = v.take(2) + end + + when :colors + parser.on('-n', '--names', TrueClass) do |v| + @color_names = v + end + + else + warn "uplot: unrecognized command '#{command}'" + exit 1 + end + end + end + def parse_options(argv = ARGV) begin main_parser.order!(argv) @@ -213,18 +207,8 @@ module Uplot @command = argv.shift&.to_sym - unless sub_parsers.key?(command) - if command.nil? - warn main_parser.help - else - warn "uplot: unrecognized command '#{command}'" - end - exit 1 - end - parser = sub_parsers[command] - begin - parser.parse!(argv) unless argv.empty? + sub_parser.parse!(argv) rescue OptionParser::ParseError => e warn "uplot: #{e.message}" exit 1