Class: DataModel::Registry

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/data_model/registry.rb

Overview

Registry allows for different type implementations to be used by the scanner. It also acts as an error message registry, mostly for pragmatic reasons.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(types: self.class.default_types, errors: self.class.default_error_messages) ⇒ Registry

Returns a new instance of Registry.



35
36
37
38
39
40
41
42
43
# File 'lib/data_model/registry.rb', line 35

def initialize(types: self.class.default_types, errors: self.class.default_error_messages)
	@error_messages = T.let(nil, T.nilable(Errors::TErrorMessages))
	if errors
		errors.each { |type, builder| register_error_message(type, &builder) }
	end

	@types = T.let({}, TTypeMap)
	types.each { |(name, type)| register(name, type) }
end

Class Method Details

.default_error_messagesObject



16
17
18
# File 'lib/data_model/registry.rb', line 16

def self.default_error_messages
	Errors.error_messages
end

.default_typesObject



11
12
13
# File 'lib/data_model/registry.rb', line 11

def self.default_types
	Builtin.types
end

.instance(types: default_types, errors: default_error_messages) ⇒ Object



22
23
24
# File 'lib/data_model/registry.rb', line 22

def self.instance(types: default_types, errors: default_error_messages)
	@instance ||= T.let(new(types:, errors:), T.nilable(Registry))
end

.register(name, type) ⇒ Object



28
29
30
# File 'lib/data_model/registry.rb', line 28

def self.register(name, type)
	instance.register(name, type)
end

Instance Method Details

#error_message(error) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/data_model/registry.rb', line 93

def error_message(error)
	type = T.let(error[0], Symbol)
	ctx = T.let(error[1], T.untyped)

	builder = error_message_builders[type]

	if builder.nil?
		raise "no error message builder for #{type}"
	end

	builder.call(ctx)
end

#error_message_buildersObject



83
84
85
86
87
88
89
# File 'lib/data_model/registry.rb', line 83

def error_message_builders
	if @error_messages.nil?
		@error_messages ||= T.let({}, T.nilable(Errors::TErrorMessages))
	end

	@error_messages
end

#error_messages(error) ⇒ Object



108
109
110
111
112
# File 'lib/data_model/registry.rb', line 108

def error_messages(error)
	error.to_h.transform_values do |error_list|
		error_list.map { |e| error_message(e) }
	end
end

#register(name, type) ⇒ Object



47
48
49
# File 'lib/data_model/registry.rb', line 47

def register(name, type)
	@types[name] = type
end

#register_error_message(type, &block) ⇒ Object



77
78
79
# File 'lib/data_model/registry.rb', line 77

def register_error_message(type, &block)
	error_message_builders[type] = block
end

#type(name, args: {}, params: nil) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/data_model/registry.rb', line 59

def type(name, args: {}, params: nil)
	if !type?(name)
		raise "#{name} is not registered as a type"
	end

	t = @types.fetch(name).new(args, registry: self)

	if params
		t.configure(params)
	end

	return t
end

#type?(name) ⇒ Boolean

Returns:



53
54
55
# File 'lib/data_model/registry.rb', line 53

def type?(name)
	@types.key?(name)
end