class Lutaml::Model::Schema::Generator::Property

It is used in the context of generating JSON schemas.
This class is used to generate a property schema definition.

def add_collection_constraints!(schema, range)

def add_collection_constraints!(schema, range)
  schema["minItems"] = range.begin
  schema["maxItems"] = range.end if range.end
end

def collection_schema(attr)

def collection_schema(attr)
  schema = {
    "type" => "array",
    "items" => generate_attribute_schema(
      attr,
      include_null: false,
      inside_collection: true,
    ),
  }
  if attr.options[:collection].is_a?(Range)
    add_collection_constraints!(schema, attr.options[:collection])
  end
  schema
end

def generate_attribute_schema(attr, options = {})

def generate_attribute_schema(attr, options = {})
  include_null = options.fetch(:include_null, true)
  inside_collection = options.fetch(:inside_collection, false)
  if attr.collection? && !inside_collection
    collection_schema(attr)
  elsif attr.serializable?(register) && polymorphic?(attr)
    polymorphic_schema(attr)
  elsif attr.serializable?(register)
    Generator::Ref.new(attr.type(register)).to_schema
  else
    primitive_schema(attr, include_null: include_null)
  end
end

def get_constraints(attr)

def get_constraints(attr)
  constraints = {}
  # Add pattern validation
  constraints["pattern"] = attr.pattern.source if attr.pattern
  # Add default value
  constraints["default"] = attr.default(register) if attr.default_set?(register)
  # Add enumeration values
  constraints["enum"] = attr.enum_values if attr.enum?
  constraints
end

def get_type(type)

def get_type(type)
  {
    Lutaml::Model::Type::String => "string",
    Lutaml::Model::Type::Integer => "integer",
    Lutaml::Model::Type::Boolean => "boolean",
    Lutaml::Model::Type::Float => "number",
    Lutaml::Model::Type::Hash => "object",
  }[type] || "string" # Default to string for unknown types
end

def initialize(name, attribute, register:)

def initialize(name, attribute, register:)
  @name = name.to_s.gsub("::", "_")
  @attribute = attribute
  @register = register
end

def polymorphic?(attr)

def polymorphic?(attr)
  Utils.present?(attr.options[:polymorphic])
end

def polymorphic_schema(attr)

def polymorphic_schema(attr)
  ref_schemas = attr.options[:polymorphic].map do |type|
    Ref.new(type).to_schema
  end
  ref_schemas << Ref.new(attr.type).to_schema if attr.type
  {
    "type" => ["object", "null"],
    "oneOf" => ref_schemas,
  }
end

def primitive_schema(attr, include_null: true)

def primitive_schema(attr, include_null: true)
  type = get_type(attr.type(register))
  type = [type, "null"] if include_null
  { "type" => type }.merge(get_constraints(attr))
end

def to_schema

def to_schema
  { name => generate_attribute_schema(attribute) }
end