Module: Spikard::DIHandlerWrapper Private
- Defined in:
- lib/spikard/provide.rb
Overview
This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.
Dependency injection handler wrapper
Wraps a route handler to inject dependencies based on parameter names. Dependencies are resolved from the DI container and passed as keyword arguments.
Class Method Summary collapse
-
.resolve_dependency(dep_def, _request) ⇒ Object
private
Resolve a dependency definition.
-
.wrap_handler(handler, dependencies) ⇒ Proc
private
Wrap a handler to inject dependencies.
Class Method Details
.resolve_dependency(dep_def, _request) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Resolve a dependency definition
202 203 204 205 206 207 208 209 210 211 212 |
# File 'lib/spikard/provide.rb', line 202 def self.resolve_dependency(dep_def, _request) case dep_def[:type] when :value dep_def[:value] when :factory factory = dep_def[:factory] dep_def[:depends_on] # TODO: Implement nested dependency resolution when dependencies are provided factory.call end end |
.wrap_handler(handler, dependencies) ⇒ Proc
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Wrap a handler to inject dependencies
rubocop:disable Metrics/AbcSize, Metrics/MethodLength
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 |
# File 'lib/spikard/provide.rb', line 159 def self.wrap_handler(handler, dependencies) # Extract parameter names from the handler params = handler.parameters.map { |_type, name| name.to_s } # Find which parameters match registered dependencies injectable_params = params & dependencies.keys if injectable_params.empty? # No DI needed, return original handler return handler end # Create wrapped handler that injects dependencies lambda do |request| # Build kwargs with injected dependencies kwargs = {} injectable_params.each do |param_name| dep_def = dependencies[param_name] kwargs[param_name.to_sym] = resolve_dependency(dep_def, request) end # Call original handler with injected dependencies if handler.arity.zero? # Handler takes no arguments (dependencies injected via closure or instance vars) handler.call elsif injectable_params.length == params.length # All parameters are dependencies handler.call(**kwargs) else # Mix of request data and dependencies handler.call(request, **kwargs) end end end |