Sha256: 2d25d86acacbfed5c9046d293f18d605419fd32b2ed903160f066b6df6fb681e

Contents?: true

Size: 1.58 KB

Versions: 341

Compression:

Stored size: 1.58 KB

Contents

# frozen_string_literal: true
# typed: true

module T::Types
  # Takes a list of types. Validates that an object matches at least one of the types.
  class Union < Base
    attr_reader :types

    def initialize(types)
      @types = types.flat_map do |type|
        if type.is_a?(Union)
          # Simplify nested unions (mostly so `name` returns a nicer value)
          type.types
        else
          T::Utils.coerce(type)
        end
      end.uniq
    end

    # @override Base
    def name
      type_shortcuts(@types)
    end

    private def type_shortcuts(types)
      if types.size == 1
        return types[0].name
      end
      nilable = T::Utils.coerce(NilClass)
      trueclass = T::Utils.coerce(TrueClass)
      falseclass = T::Utils.coerce(FalseClass)
      if types.any? {|t| t == nilable}
        remaining_types = types.reject {|t| t == nilable}
        "T.nilable(#{type_shortcuts(remaining_types)})"
      elsif types.any? {|t| t == trueclass} && types.any? {|t| t == falseclass}
        remaining_types = types.reject {|t| t == trueclass || t == falseclass}
        type_shortcuts([T::Private::Types::StringHolder.new("T::Boolean")] + remaining_types)
      else
        names = types.map(&:name).compact.sort
        "T.any(#{names.join(', ')})"
      end
    end

    # @override Base
    def valid?(obj)
      @types.each do |type|
        return true if type.valid?(obj)
      end

      false
    end

    # @override Base
    private def subtype_of_single?(other)
      raise "This should never be reached if you're going through `subtype_of?` (and you should be)"
    end

  end
end

Version data entries

341 entries across 341 versions & 1 rubygems

Version Path
sorbet-runtime-0.4.4587 lib/types/types/union.rb
sorbet-runtime-0.4.4586 lib/types/types/union.rb
sorbet-runtime-0.4.4585 lib/types/types/union.rb
sorbet-runtime-0.4.4584 lib/types/types/union.rb
sorbet-runtime-0.4.4583 lib/types/types/union.rb
sorbet-runtime-0.4.4581 lib/types/types/union.rb
sorbet-runtime-0.4.4580 lib/types/types/union.rb
sorbet-runtime-0.4.4579 lib/types/types/union.rb
sorbet-runtime-0.4.4578 lib/types/types/union.rb
sorbet-runtime-0.4.4577 lib/types/types/union.rb
sorbet-runtime-0.4.4576 lib/types/types/union.rb
sorbet-runtime-0.4.4575 lib/types/types/union.rb
sorbet-runtime-0.4.4574 lib/types/types/union.rb
sorbet-runtime-0.4.4573 lib/types/types/union.rb
sorbet-runtime-0.4.4572 lib/types/types/union.rb
sorbet-runtime-0.4.4571 lib/types/types/union.rb
sorbet-runtime-0.4.4570 lib/types/types/union.rb
sorbet-runtime-0.4.4569 lib/types/types/union.rb
sorbet-runtime-0.4.4568 lib/types/types/union.rb
sorbet-runtime-0.4.4565 lib/types/types/union.rb