Sha256: 8c1a013737e6cdce64784190e0711f17909b39c26873e7d9e2d3772d85ffb2fc

Contents?: true

Size: 1.35 KB

Versions: 4

Compression:

Stored size: 1.35 KB

Contents

# typed: strict

module DataModel
	class Builtin::BigDecimal < 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(BigDecimal))
				return [val, err]
			end

			if !val.is_a?(BigDecimal) && !coerce
				err.add(type_error(BigDecimal, val))
				return [val, err]
			end

			if !val.is_a?(BigDecimal) && coerce
				if val.is_a?(String) || val.is_a?(Numeric)
					val = BigDecimal(T.unsafe(val))
				elsif val.respond_to?(:to_d)
					val = T.cast(T.unsafe(val).to_d, BigDecimal)
				end

				if !val.is_a?(BigDecimal)
					err.add(coerce_error(BigDecimal, val))
					return [val, err]
				end
			end

			val = T.cast(val, BigDecimal)

			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

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
data_model-0.4.0 lib/data_model/builtin/big_decimal.rb
data_model-0.3.0 lib/data_model/builtin/big_decimal.rb
data_model-0.2.0 lib/data_model/builtin/big_decimal.rb
data_model-0.1.0 lib/data_model/builtin/big_decimal.rb