lib/dry/schema/message/or/multi_path.rb



# frozen_string_literal: true

require "dry/core/equalizer"

require "dry/schema/message/or/abstract"
require "dry/schema/path"

module Dry
  module Schema
    class Message
      module Or
        # A message type used by OR operations with different paths
        #
        # @api public
        class MultiPath < Abstract
          # @api private
          attr_reader :root

          # @api private
          def initialize(...)
            super
            flat_left = left.flatten
            flat_right = right.flatten
            @root = [*flat_left, *flat_right].map(&:_path).reduce(:&)
            @left = flat_left.map { _1.to_or(root) }
            @right = flat_right.map { _1.to_or(root) }
          end

          # @api public
          def to_h
            @to_h ||= Path[[*root, :or]].to_h(
              [MessageSet.new(left).to_h, MessageSet.new(right).to_h]
            )
          end
        end
      end
    end
  end
end