Sha256: 33ee74833c8e06f5be9d1654987c97e868f5faaa3a7e5bee4c3b1759fa857efe

Contents?: true

Size: 1.96 KB

Versions: 322

Compression:

Stored size: 1.96 KB

Contents

# frozen_string_literal: true
# https://jira.corp.stripe.com/browse/RUBYPLAT-1107
# typed: false

module T::Types
  # Takes a list of types. Validates each item in an array using the type in the same position
  # in the list.
  class FixedArray < Base
    attr_reader :types

    def initialize(types)
      @types = types.map {|type| T::Utils.coerce(type)}
    end

    # overrides Base
    def name
      "[#{@types.join(', ')}]"
    end

    # overrides Base
    def recursively_valid?(obj)
      if obj.is_a?(Array) && obj.length == @types.length
        i = 0
        while i < @types.length
          if !@types[i].recursively_valid?(obj[i])
            return false
          end
          i += 1
        end
        true
      else
        false
      end
    end

    # overrides Base
    def valid?(obj)
      if obj.is_a?(Array) && obj.length == @types.length
        i = 0
        while i < @types.length
          if !@types[i].valid?(obj[i])
            return false
          end
          i += 1
        end
        true
      else
        false
      end
    end

    # overrides Base
    private def subtype_of_single?(other)
      case other
      when FixedArray
        # Properly speaking, covariance here is unsound since arrays
        # can be mutated, but sorbet implements covariant tuples for
        # ease of adoption.
        @types.size == other.types.size && @types.zip(other.types).all? do |t1, t2|
          t1.subtype_of?(t2)
        end
      else
        false
      end
    end

    # This gives us better errors, e.g.:
    # "Expected [String, Symbol], got [String, String]"
    # instead of
    # "Expected [String, Symbol], got Array".
    #
    # overrides Base
    def describe_obj(obj)
      if obj.is_a?(Array)
        if obj.length == @types.length
          item_classes = obj.map(&:class).join(', ')
          "type [#{item_classes}]"
        else
          "array of size #{obj.length}"
        end
      else
        super
      end
    end
  end
end

Version data entries

322 entries across 322 versions & 2 rubygems

Version Path
devcycle-ruby-server-sdk-2.0.0 vendor/bundle/ruby/3.0.0/gems/sorbet-runtime-0.5.10648/lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10672 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10667 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10666 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10662 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10658 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10657 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10655 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10649 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10648 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10647 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10644 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10634 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10632 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10628 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10627 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10626 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10625 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10624 lib/types/types/fixed_array.rb
sorbet-runtime-0.5.10621 lib/types/types/fixed_array.rb