# typed: strict require "logger" require "bigdecimal" require "date" require "time" require "bundler/setup" require "zeitwerk" require "sorbet-runtime" loader = T.let(Zeitwerk::Loader.for_gem, Zeitwerk::Loader) loader.setup module DataModel extend T::Sig extend self TSchema = T.type_alias { T::Array[Object] } TData = T.type_alias { Object } # an error is a tuple of [error_type, error_context], where context # provides additional information about the error TError = T.type_alias { [Symbol, Object] } # a map of symbol => type, suitable for sending to a TypeRegistry TTypeMap = T.type_alias { T::Hash[Symbol, T.class_of(Type)] } # Scan a schema and create a data model, which is a configured type. sig { params(schema: TSchema, registry: Registry).returns(Model) } def define(schema, registry: Registry.instance) scanned = Scanner.scan(schema, registry) type = registry.type( scanned.type, args: scanned.args, params: scanned.params, ) model = Model.new(schema, type) return model end sig { params(name: Symbol, type: T.class_of(Type)).void } def register_global_type(name, type) Registry.register(name, type) end end