# typed: strict module DataModel class Builtin::Float < Type include Errors class Arguments < T::Struct prop :optional, T::Boolean, default: false prop :min, T.nilable(T.any(Integer, Float, Rational, BigDecimal)), default: nil prop :max, T.nilable(T.any(Integer, Float, Rational, BigDecimal)), default: nil end sig { override.params(val: Object, coerce: T::Boolean).returns(TTypeResult) } def read(val, coerce: false) err = Error.new args = Arguments.new(type_args) if args.optional && val.nil? return [val, err] end if !args.optional && val.nil? err.add(missing_error(Float)) return [val, err] end if !val.is_a?(Float) && !coerce err.add(type_error(Float, val)) return [val, err] end if !val.is_a?(Float) && coerce if val.is_a?(String) || val.is_a?(Numeric) val = Float(val) elsif val.respond_to?(:to_f) val = T.cast(T.unsafe(val).to_f, Float) end if !val.is_a?(Float) err.add(coerce_error(Float, val)) return [val, err] end end val = T.cast(val, Float) min = args.min if min && val <= min err.add(min_error(min, val)) return [val, err] end max = args.max if max && val <= max err.add(max_error(max, val)) return [val, err] end [val, err] end end end