Class: Lutaml::Xml::TypeNamespaceResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/lutaml/xml/type_namespace_resolver.rb

Overview

Resolves type namespace references from attributes

LAZY RESOLUTION (Session 126): Type namespaces are resolved during declaration planning, not collection. This prevents infinite recursion: collection → type_namespace_class → imports → new collection Safe to call type_namespace_class during planning - all mappings already imported.

Examples:

resolver = TypeNamespaceResolver.new
resolver.resolve(needs)

Instance Method Summary collapse

Constructor Details

#initialize(register = nil) ⇒ TypeNamespaceResolver

Initialize resolver with register for type resolution

Parameters:

  • register (Symbol) (defaults to: nil)

    the register ID for type resolution



20
21
22
# File 'lib/lutaml/xml/type_namespace_resolver.rb', line 20

def initialize(register = nil)
  @register = register || Lutaml::Model::Config.default_register
end

Instance Method Details

#resolve(needs) ⇒ void

This method returns an undefined value.

Resolve type namespace references collected during NamespaceCollector phase

Populates needs.type_namespaces, needs.type_namespace_classes, needs.type_attribute_namespaces, needs.type_element_namespaces from needs.type_refs

Parameters:



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/lutaml/xml/type_namespace_resolver.rb', line 32

def resolve(needs)
  type_refs = needs.type_refs
  return unless type_refs&.any?

  type_refs.each do |ref|
    attr_rule = ref.rule
    context = ref.context

    # Resolve type using Reference's mapper_class-aware register resolution
    type_ns_class = ref.namespace_class(@register)
    next unless type_ns_class

    # Populate needs just like collector would have
    needs.add_type_namespace(attr_rule.to, type_ns_class)

    if context == :attribute
      needs.add_type_attribute_namespace(type_ns_class)
      usage = :attributes
    else
      needs.add_type_element_namespace(type_ns_class)
      usage = :elements
    end

    # Track in namespaces hash
    key = type_ns_class.to_key
    usage_obj = needs.namespace(key) || NamespaceUsage.new(type_ns_class)
    usage_obj.used_in << usage
    needs.add_namespace(key, usage_obj)
  end

  # Clear type_refs after resolution (no longer needed)
  needs.clear_type_refs

  # Recursively resolve children
  needs.children&.each_value do |child_needs|
    resolve(child_needs)
  end
end