lib/dry/validation/rule.rb in dry-validation-1.0.0 vs lib/dry/validation/rule.rb in dry-validation-1.1.0

- old
+ new

@@ -52,11 +52,11 @@ # @see Contract#rule # @return [Rule] # # @api public def validate(*macros, &block) - @macros = macros.map { |spec| Array(spec) }.map(&:flatten) + @macros = parse_macros(*macros) @block = block if block self end # Define a validation function for each element of an array @@ -66,16 +66,18 @@ # # @example # rule(:nums).each do # key.failure("must be greater than 0") if value < 0 # end + # rule(:nums).each(min: 3) # # @return [Rule] # # @api public def each(*macros, &block) root = keys + macros = parse_macros(*macros) @keys = [] @block = proc do values[root].each_with_index do |_, idx| path = [*root, idx] @@ -96,9 +98,25 @@ # @return [String] # # @api public def inspect %(#<#{self.class} keys=#{keys.inspect}>) + end + + # Parse function arguments into macros structure + # + # @return [Array] + # + # @api private + def parse_macros(*args) + args.each_with_object([]) do |spec, macros| + case spec + when Hash + spec.each { |k, v| macros << [k, Array(v)] } + else + macros << Array(spec) + end + end end end end end