Sha256: 68942a438ed8f5b368b207c5f9350d33632493597f539a52443e6eeab708bf00

Contents?: true

Size: 1.27 KB

Versions: 1

Compression:

Stored size: 1.27 KB

Contents

# frozen_string_literal: true

module KO
  module Signals
    class Validator
      def initialize(signal)
        @signal = signal
      end

      def validate_args!(args)
        types = args.map(&:class)

        return if types.count == @signal.arg_types.count && types_match?(types)

        raise KO::EmitError, "expected args: #{@signal.arg_types}. given: #{types}"
      end

      def validate_callable!(callable)
        callable = validate_callable_type!(callable)
        validate_signal_arity!(callable) if callable.is_a?(Signal)
      end

      def validate_callable_type!(callable)
        return callable if callable.is_a?(Signal) || callable.is_a?(Method)

        return callable.method(@signal.receiver_name) if callable.respond_to?(@signal.receiver_name)

        raise ArgumentError, "callable must be a Signal, a Method, or must respond to #{@signal.receiver_name}"
      end

      private

      def types_match?(types) = types.each.with_index.all? { _1.ancestors.include?(@signal.arg_types[_2]) }

      def validate_signal_arity!(signal)
        return if signal.arg_types == @signal.arg_types

        raise ArgumentError,
              "target signal must have same type signature. Expected: #{@signal.arg_types}. given: #{signal.arg_types}"
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ko-0.1.2 lib/ko/signals/validator.rb