Sha256: 09fa64c2197ced201c3d7d3ea1bff6aba21ae8ec8b21f5d8a938f47970edc951

Contents?: true

Size: 1.34 KB

Versions: 7

Compression:

Stored size: 1.34 KB

Contents

# frozen_string_literal: true

require_relative '../converter'
require_relative '../null_converter'

module Necromancer
  # Container for Range converter classes
  module RangeConverters
    SINGLE_DIGIT_MATCHER = /^(\-?\d+)$/.freeze

    DIGIT_MATCHER = /^(-?\d+?)(\.{2}\.?|-|,)(-?\d+)$/.freeze

    LETTER_MATCHER = /^(\w)(\.{2}\.?|-|,)(\w)$/.freeze

    # An object that converts a String to a Range
    class StringToRangeConverter < Converter
      # Convert value to Range type with possible ranges
      #
      # @param [Object] value
      #
      # @example
      #   converter.call('0,9')  # => (0..9)
      #
      # @example
      #   converter.call('0-9')  # => (0..9)
      #
      # @api public
      def call(value, options = {})
        strict = options.fetch(:strict, config.strict)
        case value
        when SINGLE_DIGIT_MATCHER
          ::Range.new($1.to_i, $1.to_i)
        when DIGIT_MATCHER
          ::Range.new($1.to_i, $3.to_i, $2 == '...')
        when LETTER_MATCHER
          ::Range.new($1.to_s, $3.to_s, $2 == '...')
        else
          strict ? raise_conversion_type(value) : value
        end
      end
    end

    def self.load(conversions)
      conversions.register StringToRangeConverter.new(:string, :range)
      conversions.register NullConverter.new(:range, :range)
    end
  end # RangeConverters
end # Necromancer

Version data entries

7 entries across 7 versions & 2 rubygems

Version Path
pokedex-terminal-0.2.8 vendor/bundle/ruby/2.7.0/gems/necromancer-0.5.1/lib/necromancer/converters/range.rb
pokedex-terminal-0.2.7 vendor/bundle/ruby/2.7.0/gems/necromancer-0.5.1/lib/necromancer/converters/range.rb
pokedex-terminal-0.2.6 vendor/bundle/ruby/2.7.0/gems/necromancer-0.5.1/lib/necromancer/converters/range.rb
pokedex-terminal-0.2.5 vendor/bundle/ruby/2.7.0/gems/necromancer-0.5.1/lib/necromancer/converters/range.rb
pokedex-terminal-0.2.4 vendor/bundle/ruby/2.7.0/gems/necromancer-0.5.1/lib/necromancer/converters/range.rb
necromancer-0.5.1 lib/necromancer/converters/range.rb
necromancer-0.5.0 lib/necromancer/converters/range.rb