Class: EasyTalk::Builders::Registry

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

Overview

Registry for type-to-builder mappings.

The registry allows custom types to be registered with their corresponding schema builder classes at runtime, without modifying the gem's source code.

Custom registrations take priority over built-in types, allowing users to override default behavior when needed.

Examples:

Registering a custom type

EasyTalk::Builders::Registry.register(Money, MoneySchemaBuilder)

Registering a collection type

EasyTalk::Builders::Registry.register(CustomArray, CustomArrayBuilder, collection: true)

Resolving a builder for a type

builder_class, is_collection = EasyTalk::Builders::Registry.resolve(Money)
builder_class.new(name, constraints).build

Class Method Summary collapse

Class Method Details

.register(type_key, builder_class, collection: false) ⇒ Object

Raises:

  • (ArgumentError)


51
52
53
54
55
56
# File 'lib/easy_talk/builders/registry.rb', line 51

def register(type_key, builder_class, collection: false)
  raise ArgumentError, 'Builder must respond to .new' unless builder_class.respond_to?(:new)

  key = normalize_key(type_key)
  registry[key] = { builder: builder_class, collection: collection }
end

.register_built_in_typesObject



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/easy_talk/builders/registry.rb', line 119

def register_built_in_types
  register(String, Builders::StringBuilder)
  register(Integer, Builders::IntegerBuilder)
  register(Float, Builders::NumberBuilder)
  register(BigDecimal, Builders::NumberBuilder)
  register('T::Boolean', Builders::BooleanBuilder)
  register(TrueClass, Builders::BooleanBuilder)
  register(NilClass, Builders::NullBuilder)
  register(Date, Builders::TemporalBuilder::DateBuilder)
  register(DateTime, Builders::TemporalBuilder::DatetimeBuilder)
  register(Time, Builders::TemporalBuilder::TimeBuilder)
  register('allOf', Builders::CompositionBuilder::AllOfBuilder, collection: true)
  register('anyOf', Builders::CompositionBuilder::AnyOfBuilder, collection: true)
  register('oneOf', Builders::CompositionBuilder::OneOfBuilder, collection: true)
  register('EasyTalk::Types::Tuple', Builders::TupleBuilder, collection: true)
  register('T::Types::TypedArray', Builders::TypedArrayBuilder, collection: true)
  register('T::Types::Union', Builders::UnionBuilder, collection: true)
end

.registered?(type_key) ⇒ Boolean

Returns:

  • (Boolean)


84
85
86
# File 'lib/easy_talk/builders/registry.rb', line 84

def registered?(type_key)
  registry.key?(normalize_key(type_key))
end

.registered_typesObject



101
102
103
# File 'lib/easy_talk/builders/registry.rb', line 101

def registered_types
  registry.keys
end

.registryObject



32
33
34
# File 'lib/easy_talk/builders/registry.rb', line 32

def registry
  @registry ||= {}
end

.reset!Object



109
110
111
112
# File 'lib/easy_talk/builders/registry.rb', line 109

def reset!
  @registry = nil
  register_built_in_types
end

.resolve(type) ⇒ Object



72
73
74
75
76
77
# File 'lib/easy_talk/builders/registry.rb', line 72

def resolve(type)
  entry = find_registration(type)
  return nil unless entry

  [entry[:builder], entry[:collection]]
end

.unregister(type_key) ⇒ Object



93
94
95
# File 'lib/easy_talk/builders/registry.rb', line 93

def unregister(type_key)
  registry.delete(normalize_key(type_key))
end