lib/lutaml/model/schema/generator/properties_collection.rb



require_relative "property"
require_relative "../shared_methods"

module Lutaml
  module Model
    module Schema
      module Generator
        class PropertiesCollection
          class << self
            include SharedMethods

            def from_class(klass)
              from_attributes(klass.attributes.values, extract_register_from(klass))
            end

            def from_attributes(attributes, register)
              new(register: register).tap do |collection|
                attributes.each do |attribute|
                  name = attribute.name
                  collection << Property.new(name, attribute, register: register)
                end
              end
            end
          end

          attr_reader :properties, :register

          def initialize(properties = [], register:)
            self.properties = properties
            @register = register
          end

          def to_schema
            properties.each_with_object({}) do |property, schema|
              schema.merge!(property.to_schema)
            end
          end

          def add_property(property)
            @properties << if property.is_a?(Property)
                             property
                           else
                             Property.new(property.name, property, register: register)
                           end
          end
          alias << add_property
          alias push add_property

          def properties=(properties)
            @properties ||= []
            @properties.clear

            @properties = properties.map do |property|
              next property if property.is_a?(Property)

              Property.new(property.name, property, register)
            end
          end
        end
      end
    end
  end
end