Sha256: 7c63a10512b45444e6613e42292613223de68e87adeed942833e16b3e6e21293

Contents?: true

Size: 1.83 KB

Versions: 6

Compression:

Stored size: 1.83 KB

Contents

# frozen_string_literal: true

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

module EacCli
  class Parser
    class PositionalCollection
      common_constructor(:definition, :argv, :collector) { collect }

      private

      def argv_enum
        @argv_enum ||= argv.each
      end

      def argv_pending?
        argv_enum.ongoing?
      end

      def argv_pending_check
        return unless argv_pending?
        return unless positional_enum.stopped?

        raise ::EacCli::Parser::Error.new(
          definition, argv, "No positional left for argv \"#{argv_enum.current}\""
        )
      end

      def collected
        @collected ||= ::Set.new
      end

      def collect
        loop do
          break unless enums('pending?').any?

          enums('pending_check')
          collect_argv_value
        end
      end

      def collect_argv_value
        collector.collect(*enums('enum', &:peek))
        collected << positional_enum.peek
        positional_enum.next unless positional_enum.peek.repeat?
        argv_enum.next
      end

      def enums(method_suffix, &block)
        %w[positional argv].map do |method_prefix|
          v = send("#{method_prefix}_#{method_suffix}")
          block ? block.call(v) : v
        end
      end

      def positional_enum
        @positional_enum ||= definition.positional.each
      end

      def positional_pending?
        !(positional_enum.stopped? || positional_enum.current.optional? ||
            collected.include?(positional_enum.current))
      end

      def positional_pending_check
        return unless positional_pending?
        return unless argv_enum.stopped?

        raise ::EacCli::Parser::Error.new(
          definition, argv, 'No value for required positional ' \
            "\"#{positional_enum.current.identifier}\""
        )
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 3 rubygems

Version Path
ehbrs-tools-0.16.1 vendor/eac_cli/lib/eac_cli/parser/positional_collection.rb
eac_cli-0.11.1 lib/eac_cli/parser/positional_collection.rb
avm-tools-0.76.1 vendor/eac_cli/lib/eac_cli/parser/positional_collection.rb
eac_cli-0.11.0 lib/eac_cli/parser/positional_collection.rb
eac_cli-0.10.0 lib/eac_cli/parser/positional_collection.rb
ehbrs-tools-0.16.0 vendor/eac_cli/lib/eac_cli/parser/positional_collection.rb