Sha256: 54930ab42ffcac865f25ce99ed0f951d39d0a6bb6d4b653878209f59f9d7636f

Contents?: true

Size: 1.43 KB

Versions: 3

Compression:

Stored size: 1.43 KB

Contents

# frozen_string_literal: true

module Marameters
  # Builds the primary argument categories based on method parameters and arguments.
  class Categorizer
    def initialize model: Models::Forward
      @model = model
    end

    def call parameters, arguments
      @record = model.new
      map parameters, arguments.is_a?(Array) ? arguments : [arguments]
    end

    private

    attr_reader :model, :record

    def map parameters, arguments
      size = arguments.size
      parameters.each.with_index { |pair, index| filter pair, arguments[index] if index < size }
      record
    end

    def filter pair, value
      case pair
        in [:rest] | [:rest, :*] then to_array value
        in [:keyrest] | [:keyrest, :**] then record.keywords = Hash value
        in [:req, *] | [:opt, *] then record.positionals.append value
        in [:rest, *] then record.positionals.append(*value)
        in [:nokey] then nil
        in [:keyreq, *] | [:key, *] then record.keywords.merge! value if value
        in [:keyrest, *] then record.keywords.merge!(**value) if value
        in [:block, *] then record.block = value
        else fail ArgumentError, "Invalid parameter kind: #{pair.first.inspect}."
      end
    rescue TypeError
      raise TypeError, "#{value.inspect} is an invalid #{pair.first.inspect} value."
    end

    def to_array value
      return unless value

      record.positionals = value.is_a?(Array) ? value : [value]
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
marameters-4.2.0 lib/marameters/categorizer.rb
marameters-4.1.0 lib/marameters/categorizer.rb
marameters-4.0.1 lib/marameters/categorizer.rb