class Validate::Arguments::ArgumentsGuard

Constants

DEFAULT_VALUE

Public Class Methods

new(method, rules) click to toggle source
# File lib/validate/arguments.rb, line 54
      def initialize(method, rules)
        signature = []
        assertions = []

        method.parameters.each do |(kind, name)|
          case kind
          when :req
            signature << name.to_s
          when :opt
            signature << "#{name} = DEFAULT_VALUE"
          when :rest
            signature << "*#{name}"
          when :keyreq
            signature << "#{name}:"
          when :key
            signature << "#{name}: DEFAULT_VALUE"
          when :keyrest
            signature << "**#{name}"
          when :block
            signature << "&#{name}"
          else
            raise Error::ArgumentError,
                  "unsupported parameter type #{kind}"
          end
          next unless rules.include?(name)

          assertions <<
            "@rules[:#{name}].assert(#{name}, message: '#{name}') unless #{name}.eql?(DEFAULT_VALUE)"
        end

        singleton_class.class_eval(<<~RUBY, __FILE__, __LINE__)
          def enforce!(#{signature.join(', ')})
            #{assertions.join("\n  ")}
          end
        RUBY

        @rules = rules
      end