module Di::KeyParser

Overview

Shared key parsing utilities for Registry and Scope. Handles Crystal namespaced types (e.g. "NS::C:name") correctly.

Key format:

The "~" prefix ensures interface bindings don't leak into concrete resolution.

Direct including types

Defined in:

di/key_parser.cr

Constant Summary

INTERFACE_PREFIX = "~"

Marker prefix for interface binding keys.

Instance Method Summary

Instance Method Detail

def interface_prefix(interface_type : String) : String #

Build interface lookup prefix for scanning.


[View source]
def key(type : String, impl : String | Nil = nil, name : String | Nil = nil) : String #

Build a registry key from segments joined by ':'. key(type: "Type") → "Type" key(type: "Type", name: "primary") → "Type:primary" key(type: "Type", impl: "Impl") → "~Type:Impl" key(type: "Type", impl: "Impl", name: "primary") → "~Type:Impl:primary"


[View source]
def parse_key(key : String) : Tuple(String, String | Nil) #

Parse a registry key into (type_name, service_name) tuple. Finds the first single ':' that isn't part of '::' namespace separator. Strips interface marker from type_name if present.


[View source]
def resolve_ambiguous(matches : Array(Provider::Base), interface_type : String, name : String) : Provider::Base #

Check for ambiguous named matches and return single provider or raise.


[View source]
def resolve_ambiguous?(matches : Array(Provider::Base), interface_type : String) : Provider::Base | Nil #

Like resolve_ambiguous, but returns nil instead of raising ServiceNotFound.


[View source]