Class: Metaschema::ModelGenerator::AssemblyFactory

Inherits:
Object
  • Object
show all
Defined in:
lib/metaschema/model_generator/assembly_factory.rb

Overview

Creates assembly classes from Metaschema assembly definitions. Handles placeholder creation, population with XML/JSON mappings, model processing (fields, assemblies, choices), and custom serialization callbacks (BY_KEY, SINGLETON_OR_ARRAY, json-value-key-flag).

Instance Method Summary collapse

Constructor Details

#initialize(assembly_def, generator) ⇒ AssemblyFactory

Returns a new instance of AssemblyFactory.



10
11
12
13
# File 'lib/metaschema/model_generator/assembly_factory.rb', line 10

def initialize(assembly_def, generator)
  @assembly_def = assembly_def
  @g = generator
end

Instance Method Details

#create_placeholderObject



15
16
17
18
19
20
21
# File 'lib/metaschema/model_generator/assembly_factory.rb', line 15

def create_placeholder
  ad = @assembly_def
  return unless ad.name

  klass_name = "Assembly_#{ad.name.gsub('-', '_')}"
  @g.classes[klass_name] ||= Class.new(Lutaml::Model::Serializable)
end

#populateObject



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/metaschema/model_generator/assembly_factory.rb', line 23

def populate
  ad = @assembly_def
  return unless ad.name

  klass_name = "Assembly_#{ad.name.gsub('-', '_')}"
  klass = @g.classes[klass_name]
  return unless klass

  @g.current_assembly_name = ad.name.gsub("-", "_")

  ad.define_flag&.each { |f| @g.add_inline_flag(klass, f) }
  ad.flag&.each { |f| @g.add_flag_reference(klass, f) }

  process_model(klass, ad.model) if ad.model

  root_name = ad.root_name&.content || ad.name
  build_assembly_xml(klass, root_name, ad)
  build_assembly_json(klass, root_name, ad)

  if ad.root_name&.content
    add_json_root_handling(klass, root_name)
  end

  @g.apply_constraint_validation(klass, ad.constraint)
  klass.instance_variable_set(:@populated, true)
ensure
  @g.current_assembly_name = nil
end