module T::Props::TypeValidation::DecoratorMethods

Public Instance Methods

prop_validate_definition!(name, _cls, rules, type) click to toggle source
Calls superclass method
# File lib/types/props/type_validation.rb, line 28
def prop_validate_definition!(name, _cls, rules, type)
  super

  if !rules[:DEPRECATED_underspecified_type]
    validate_type(type, field_name: name)
  elsif rules[:DEPRECATED_underspecified_type] && find_invalid_subtype(type).nil?
    raise ArgumentError.new("DEPRECATED_underspecified_type set unnecessarily for #{@class.name}.#{name} - #{type} is a valid type")
  end
end
valid_rule_key?(key) click to toggle source
Calls superclass method
# File lib/types/props/type_validation.rb, line 15
def valid_rule_key?(key)
  super || key == :DEPRECATED_underspecified_type
end

Private Instance Methods

find_invalid_subtype(type) click to toggle source
# File lib/types/props/type_validation.rb, line 59
        def find_invalid_subtype(type)
  case type
  when T::Types::TypedEnumerable
    find_invalid_subtype(type.type)
  when T::Types::FixedHash
    type.types.values.map {|subtype| find_invalid_subtype(subtype)}.compact.first
  when T::Types::Union, T::Types::FixedArray
    # `T.any` is valid if all of the members are valid
    type.types.map {|subtype| find_invalid_subtype(subtype)}.compact.first
  when T::Types::Intersection
    # `T.all` is valid if at least one of the members is valid
    invalid = type.types.map {|subtype| find_invalid_subtype(subtype)}.compact
    if invalid.length == type.types.length
      invalid.first
    else
      nil
    end
  when T::Types::Enum, T::Types::ClassOf
    nil
  when T::Private::Types::TypeAlias
    find_invalid_subtype(type.aliased_type)
  when T::Types::Simple
    # TODO Could we manage to define a whitelist, consisting of something
    # like primitives, subdocs, DataInterfaces, and collections/enums/unions
    # thereof?
    if BANNED_TYPES.include?(type.raw_type)
      type
    else
      nil
    end
  else
    type
  end
end
type_error_message(type, field_name, orig_type) click to toggle source
# File lib/types/props/type_validation.rb, line 102
        def type_error_message(type, field_name, orig_type)
  msg_prefix = "#{@class.name}.#{field_name}: #{orig_type} is invalid in prop definition"
  if type == orig_type
    "#{msg_prefix}. Please choose a more specific type (T.untyped and ~equivalents like Object are banned)."
  else
    "#{msg_prefix}. Please choose a subtype more specific than #{type} (T.untyped and ~equivalents like Object are banned)."
  end
end
validate_type(type, field_name:) click to toggle source
# File lib/types/props/type_validation.rb, line 45
        def validate_type(type, field_name:)
  if (invalid_subtype = find_invalid_subtype(type))
    raise UnderspecifiedType.new(type_error_message(invalid_subtype, field_name, type))
  end
end