Sha256: cd4b9d5bdc44df108be5cf5e25494f52da41bc0ab1d60c33020e1b41378477d3

Contents?: true

Size: 1.85 KB

Versions: 8

Compression:

Stored size: 1.85 KB

Contents

# frozen_string_literal: true

require 'eac_cli/parser/collector'
require 'eac_cli/parser/error'
require 'eac_ruby_utils/core_ext'

module EacCli
  class Parser
    class Alternative
      require_sub __FILE__, include_modules: true
      enable_listable
      lists.add_symbol :phase, :any, :option_argument, :positional
      attr_reader :error

      common_constructor :alternative, :argv do
        alternative.assert_argument(::EacCli::Definition::Alternative, :alternative)
        self.phase = PHASE_ANY
        collect
      end

      def error?
        error.present?
      end

      def success?
        !error?
      end

      def parsed
        @parsed ||= collector.to_data.freeze
      end

      private

      attr_accessor :phase

      def any_collect_argv_value
        %w[double_dash long_option short_option].each do |arg_type|
          return send("#{arg_type}_collect_argv_value") if send("argv_current_#{arg_type}?")
        end

        positional_collect_argv_value
      end

      def collector
        @collector ||= ::EacCli::Parser::Collector.new(alternative)
      end

      def collect
        loop do
          break unless argv_pending?

          collect_argv_value
        end
        validate
      rescue ::EacCli::Parser::Error => e
        @error = e
      end

      def collect_argv_value
        send("#{phase}_collect_argv_value")
        argv_enum.next
      end

      def raise_error(message)
        raise ::EacCli::Parser::Error.new(alternative, argv, message)
      end

      def validate
        (alternative.options + alternative.positional).each do |option|
          validate_option(option)
        end
      end

      def validate_option(option)
        return unless option.required?
        return if collector.supplied?(option)

        raise_error("Required option/positional #{option} not supplied")
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 2 rubygems

Version Path
eac_tools-0.81.0 sub/eac_cli/lib/eac_cli/parser/alternative.rb
eac_tools-0.80.0 sub/eac_cli/lib/eac_cli/parser/alternative.rb
eac_tools-0.79.0 sub/eac_cli/lib/eac_cli/parser/alternative.rb
eac_tools-0.78.0 sub/eac_cli/lib/eac_cli/parser/alternative.rb
eac_tools-0.77.1 sub/eac_cli/lib/eac_cli/parser/alternative.rb
eac_tools-0.77.0 sub/eac_cli/lib/eac_cli/parser/alternative.rb
eac_cli-0.38.0 lib/eac_cli/parser/alternative.rb
eac_tools-0.76.1 sub/eac_cli/lib/eac_cli/parser/alternative.rb