Sha256: b85ae2be12eb41078cc3f289f9580edd3ec1444b4adbd5eb45ecc350c330acca

Contents?: true

Size: 1.57 KB

Versions: 10

Compression:

Stored size: 1.57 KB

Contents

# frozen_string_literal: true

require "refinements/structs"

module Marameters
  # Builds the primary argument categories based on method parameters and arguments.
  class Categorizer
    using Refinements::Structs

    def initialize parameters, model: Splat
      @parameters = parameters
      @model = model
    end

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

    private

    attr_reader :parameters, :model, :record

    def map arguments
      return record if arguments.empty?

      size = arguments.size

      parameters.each.with_index do |pair, index|
        filter pair, arguments[index] if index < size
      end
    end

    def filter pair, value
      case pair
        in [:rest] | [:rest, :*] then splat_positional 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 splat_positional value
      return unless value

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

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
marameters-2.1.1 lib/marameters/categorizer.rb
marameters-2.1.0 lib/marameters/categorizer.rb
marameters-2.0.1 lib/marameters/categorizer.rb
marameters-2.0.0 lib/marameters/categorizer.rb
marameters-1.0.4 lib/marameters/categorizer.rb
marameters-1.0.3 lib/marameters/categorizer.rb
marameters-1.0.2 lib/marameters/categorizer.rb
marameters-1.0.1 lib/marameters/categorizer.rb
marameters-0.10.0 lib/marameters/categorizer.rb
marameters-0.9.0 lib/marameters/categorizer.rb