Module: T::Props::Private::SetterFactory
- Extended by:
- Sig
- Defined in:
- lib/types/props/private/setter_factory.rb
Constant Summary collapse
- SetterProc =
T.type_alias {T.proc.params(val: T.untyped).void}
- ValidateProc =
T.type_alias {T.proc.params(prop: Symbol, value: T.untyped).void}
Class Method Summary collapse
- .build_setter_proc(klass, prop, rules) ⇒ Object
- .raise_pretty_error(klass, prop, type, val) ⇒ Object
Methods included from Sig
Class Method Details
.build_setter_proc(klass, prop, rules) ⇒ Object
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/types/props/private/setter_factory.rb', line 21 def self.build_setter_proc(klass, prop, rules) # Our nil check works differently than a simple T.nilable for various # reasons (including the `raise_on_nil_write` setting and the existence # of defaults & factories), so unwrap any T.nilable and do a check # manually. non_nil_type = T::Utils::Nilable.(rules.fetch(:type_object)) accessor_key = rules.fetch(:accessor_key) validate = rules[:setter_validate] # It seems like a bug that this affects the behavior of setters, but # some existing code relies on this behavior has_explicit_nil_default = rules.key?(:default) && rules.fetch(:default).nil? # Use separate methods in order to ensure that we only close over necessary # variables if !T::Props::Utils.need_nil_write_check?(rules) || has_explicit_nil_default if validate.nil? && non_nil_type.is_a?(T::Types::Simple) simple_nilable_proc(prop, accessor_key, non_nil_type.raw_type, klass) else nilable_proc(prop, accessor_key, non_nil_type, klass, validate) end else if validate.nil? && non_nil_type.is_a?(T::Types::Simple) simple_non_nil_proc(prop, accessor_key, non_nil_type.raw_type, klass) else non_nil_proc(prop, accessor_key, non_nil_type, klass, validate) end end end |
.raise_pretty_error(klass, prop, type, val) ⇒ Object
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
# File 'lib/types/props/private/setter_factory.rb', line 175 def self.raise_pretty_error(klass, prop, type, val) = "Can't set #{klass.name}.#{prop} to #{val.inspect} (instance of #{val.class}) - need a #{type}" = "Parameter '#{prop}': #{}\n" caller_loc = caller_locations.find {|l| !l.to_s.include?('sorbet-runtime/lib/types/props')} if caller_loc += "Caller: #{caller_loc.path}:#{caller_loc.lineno}\n" end T::Configuration.call_validation_error_handler( nil, message: , pretty_message: , kind: 'Parameter', name: prop, type: type, value: val, location: caller_loc, ) end |