Sha256: 787efcf91264d0cfdf5afb1438f729a881d3f3c9a141f526a2f31bac104761d2

Contents?: true

Size: 1.25 KB

Versions: 3

Compression:

Stored size: 1.25 KB

Contents

require 'dry/validation/rule'

module Dry
  module Validation
    class Schema
      class Key
        attr_reader :name, :rules

        def initialize(name, rules, &block)
          @name = name
          @rules = rules
        end

        def optional(&block)
          key_rule = key?

          val_rule = yield(Value.new(name))

          rules <<
            if val_rule.is_a?(Array)
              Schema::Rule.new([:implication, [key_rule.to_ary, [:set, [name, val_rule.map(&:to_ary)]]]])
            else
              Schema::Rule.new([:implication, [key_rule.to_ary, val_rule.to_ary]])
            end
        end

        private

        def method_missing(meth, *args, &block)
          key_rule = [:key, [name, [:predicate, [meth, args]]]]

          if block
            val_rule = yield(Value.new(name))

            rules <<
              if val_rule.is_a?(Array)
                Schema::Rule.new([:and, [key_rule, [:set, [name, val_rule.map(&:to_ary)]]]])
              else
                Schema::Rule.new([:and, [key_rule, val_rule.to_ary]])
              end
          else
            Schema::Rule.new(key_rule)
          end
        end

        def respond_to_missing?(meth, _include_private = false)
          true
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
dry-validation-0.3.1 lib/dry/validation/schema/key.rb
dry-validation-0.3.0 lib/dry/validation/schema/key.rb
dry-validation-0.2.0 lib/dry/validation/schema/key.rb