Sha256: 14bd13dc5915e01bc3dddeab6cef2ad1c1b5ac05627e28768d4dac1dc8a73016

Contents?: true

Size: 1.71 KB

Versions: 4

Compression:

Stored size: 1.71 KB

Contents

# typed: strict

module DataModel
	class Builtin::Array < Type
		include Errors

		class Arguments < T::Struct
			prop :optional, T::Boolean, default: false
			prop :wrap_single_value, 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
			prop :length, T.nilable(T.any(Integer, Float, Rational, BigDecimal)), default: nil
		end

		# support either :string shorthand or [:string, {optional: true}]
		sig { override.params(params: T::Array[Object]).void }
		def configure(params)
			if params.first.is_a?(Array)
				params = params.first
			end

			params = T.cast(params, TSchema)
			node = Scanner.scan(params)
			type = instantiate(node.type, args: node.args, params: node.params)

			@child_type = T.let(type, T.nilable(Type))
		end

		sig { returns(Type) }
		def child_type
			if @child_type.nil?
				raise "children not configured"
			end

			return @child_type
		end

		sig { override.params(val: Object, coerce: T::Boolean).returns(TTypeResult) }
		def read(val, coerce: false)
			args = Arguments.new(type_args)
			err = Error.new

			if val.nil? && !args.optional
				err.add(missing_error(Array))
				return [val, err]
			end

			if coerce && args.wrap_single_value
				val = Array(val)
			end

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

			coerced = []

			for i in 0...val.length
				child_val = T.let(val[i], Object)
				child, child_err = child_type.read(child_val, coerce:)
				if child_err
					err.merge_child(i.to_s.to_sym, child_err)
				end
				coerced << child
			end

			result = coerce ? coerced : val

			return [result, 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/array.rb
data_model-0.3.0 lib/data_model/builtin/array.rb
data_model-0.2.0 lib/data_model/builtin/array.rb
data_model-0.1.0 lib/data_model/builtin/array.rb