class Lutaml::Model::Xml::Mapping

def attribute(name)

def attribute(name)
  attributes.detect do |rule|
    name == rule.to
  end
end

def attributes

def attributes
  @attributes.values
end

def attributes_to_dup

def attributes_to_dup
  @attributes_to_dup ||= %i[
    @content_mapping
    @raw_mapping
    @element_sequence
    @attributes
    @elements
  ]
end

def content_mapping

def content_mapping
  @content_mapping
end

def deep_dup

def deep_dup
  self.class.new.tap do |xml_mapping|
    xml_mapping.root(@root_element.dup, mixed: @mixed_content,
                                        ordered: @ordered)
    xml_mapping.namespace(@namespace_uri.dup, @namespace_prefix.dup)
    attributes_to_dup.each do |var_name|
      value = instance_variable_get(var_name)
      xml_mapping.instance_variable_set(var_name, Utils.deep_dup(value))
    end
  end
end

def dup_mappings(mappings)

def dup_mappings(mappings)
  new_mappings = {}
  mappings.each do |key, mapping_rule|
    new_mappings[key] = mapping_rule.deep_dup
  end
  new_mappings
end

def element(name)

def element(name)
  elements.detect do |rule|
    name == rule.to
  end
end

def elements

def elements
  @elements.values
end

def finalize(mapper_class)

def finalize(mapper_class)
  if !root_element && !no_root?
    root(mapper_class.model.to_s)
  end
end

def find_by_name(name)

def find_by_name(name)
  if ["text", "#cdata-section"].include?(name.to_s)
    content_mapping
  else
    mappings.detect do |rule|
      rule.name == name.to_s || rule.name == name.to_sym
    end
  end
end

def import_model_mappings(model)

def import_model_mappings(model)
  raise Lutaml::Model::ImportModelWithRootError.new(model) if model.root?
  mappings = model.mappings_for(:xml)
  @elements.merge!(mappings.instance_variable_get(:@elements))
  @attributes.merge!(mappings.instance_variable_get(:@attributes))
  (@element_sequence << mappings.element_sequence).flatten!
end

def initialize

def initialize
  super
  @elements = {}
  @attributes = {}
  @element_sequence = []
  @content_mapping = nil
  @raw_mapping = nil
  @mixed_content = false
  @format = :xml
end

def map_all(

def map_all(
  to:,
  render_nil: false,
  render_default: false,
  delegate: nil,
  with: {},
  namespace: (namespace_set = false
              nil),
  prefix: (prefix_set = false
           nil),
  render_empty: false
)
  validate!(
    Constants::RAW_MAPPING_KEY,
    to,
    with,
    render_nil,
    render_empty,
    type: TYPES[:all_content],
  )
  rule = MappingRule.new(
    Constants::RAW_MAPPING_KEY,
    to: to,
    render_nil: render_nil,
    render_default: render_default,
    with: with,
    delegate: delegate,
    namespace: namespace,
    prefix: prefix,
    default_namespace: namespace_uri,
    namespace_set: namespace_set != false,
    prefix_set: prefix_set != false,
  )
  @raw_mapping = rule
end

def map_attribute(

def map_attribute(
  name,
  to: nil,
  render_nil: false,
  render_default: false,
  render_empty: false,
  with: {},
  delegate: nil,
  polymorphic_map: {},
  namespace: (namespace_set = false
              nil),
  prefix: (prefix_set = false
           nil),
  transform: {},
  value_map: {}
)
  validate!(
    name, to, with, render_nil, render_empty, type: TYPES[:attribute]
  )
  if name == "schemaLocation"
    Logger.warn_auto_handling(
      name: name,
      caller_file: File.basename(caller_locations(1, 1)[0].path),
      caller_line: caller_locations(1, 1)[0].lineno,
    )
  end
  rule = MappingRule.new(
    name,
    to: to,
    render_nil: render_nil,
    render_default: render_default,
    with: with,
    delegate: delegate,
    namespace: namespace,
    prefix: prefix,
    attribute: true,
    polymorphic_map: polymorphic_map,
    default_namespace: namespace_uri,
    namespace_set: namespace_set != false,
    prefix_set: prefix_set != false,
    transform: transform,
    value_map: value_map,
  )
  @attributes[rule.namespaced_name] = rule
end

def map_content(

def map_content(
  to: nil,
  render_nil: false,
  render_default: false,
  render_empty: false,
  with: {},
  delegate: nil,
  mixed: false,
  cdata: false,
  transform: {},
  value_map: {}
)
  validate!(
    "content", to, with, render_nil, render_empty, type: TYPES[:content]
  )
  @content_mapping = MappingRule.new(
    nil,
    to: to,
    render_nil: render_nil,
    render_default: render_default,
    render_empty: render_empty,
    with: with,
    delegate: delegate,
    mixed_content: mixed,
    cdata: cdata,
    transform: transform,
    value_map: value_map,
  )
end

def map_element(

rubocop:disable Metrics/ParameterLists
def map_element(
  name,
  to: nil,
  render_nil: false,
  render_default: false,
  render_empty: false,
  treat_nil: :nil,
  treat_empty: :empty,
  treat_omitted: :nil,
  with: {},
  delegate: nil,
  cdata: false,
  polymorphic: {},
  namespace: (namespace_set = false
              nil),
  prefix: (prefix_set = false
           nil),
  transform: {},
  value_map: {}
)
  validate!(
    name, to, with, render_nil, render_empty, type: TYPES[:element]
  )
  rule = MappingRule.new(
    name,
    to: to,
    render_nil: render_nil,
    render_default: render_default,
    render_empty: render_empty,
    treat_nil: treat_nil,
    treat_empty: treat_empty,
    treat_omitted: treat_omitted,
    with: with,
    delegate: delegate,
    cdata: cdata,
    namespace: namespace,
    default_namespace: namespace_uri,
    prefix: prefix,
    polymorphic: polymorphic,
    namespace_set: namespace_set != false,
    prefix_set: prefix_set != false,
    transform: transform,
    value_map: value_map,
  )
  @elements[rule.namespaced_name] = rule
end

def mapping_attributes_hash

def mapping_attributes_hash
  @attributes
end

def mapping_elements_hash

def mapping_elements_hash
  @elements
end

def mappings

def mappings
  elements + attributes + [content_mapping, raw_mapping].compact
end

def merge_elements_sequence(mapping)

def merge_elements_sequence(mapping)
  mapping.element_sequence.each do |sequence|
    element_sequence << Lutaml::Model::Sequence.new(self).tap do |instance|
      sequence.attributes.each do |attr|
        instance.attributes << attr.deep_dup
      end
    end
  end
end

def merge_mapping_attributes(mapping)

def merge_mapping_attributes(mapping)
  mapping_attributes_hash.merge!(mapping.mapping_attributes_hash)
end

def merge_mapping_elements(mapping)

def merge_mapping_elements(mapping)
  mapping_elements_hash.merge!(mapping.mapping_elements_hash)
end

def namespace(uri, prefix = nil)

def namespace(uri, prefix = nil)
  raise Lutaml::Model::NoRootNamespaceError if no_root?
  @namespace_uri = uri
  @namespace_prefix = prefix
end

def no_root

def no_root
  @no_root = true
end

def no_root?

def no_root?
  !!@no_root
end

def polymorphic_mapping

def polymorphic_mapping
  mappings.find(&:polymorphic_mapping?)
end

def prefixed_root

def prefixed_root
  if namespace_uri && namespace_prefix
    "#{namespace_prefix}:#{root_element}"
  else
    root_element
  end
end

def raw_mapping

def raw_mapping
  @raw_mapping
end

def root(name, mixed: false, ordered: false)

def root(name, mixed: false, ordered: false)
  @root_element = name
  @mixed_content = mixed
  @ordered = ordered || mixed # mixed contenet will always be ordered
end

def root?

def root?
  !!root_element
end

def sequence(&block)

def sequence(&block)
  @element_sequence << Sequence.new(self).tap do |s|
    s.instance_eval(&block)
  end
end

def validate!(key, to, with, render_nil, render_empty, type: nil)

def validate!(key, to, with, render_nil, render_empty, type: nil)
  validate_raw_mappings!(type)
  validate_to_and_with_arguments!(key, to, with)
  if render_nil == :as_empty || render_empty == :as_empty
    raise IncorrectMappingArgumentsError.new(
      ":as_empty is not supported for XML mappings",
    )
  end
end

def validate_raw_mappings!(type)

def validate_raw_mappings!(type)
  if !@raw_mapping.nil? && type != TYPES[:attribute]
    raise StandardError, "#{type} is not allowed, only #{TYPES[:attribute]} " \
                         "is allowed with #{TYPES[:all_content]}"
  end
  if !(elements.empty? && content_mapping.nil?) && type == TYPES[:all_content]
    raise StandardError, "#{TYPES[:all_content]} is not allowed with other mappings"
  end
end

def validate_to_and_with_arguments!(key, to, with)

def validate_to_and_with_arguments!(key, to, with)
  if to.nil? && with.empty?
    raise IncorrectMappingArgumentsError.new(
      ":to or :with argument is required for mapping '#{key}'",
    )
  end
  validate_with_options!(key, to, with)
end

def validate_with_options!(key, to, with)

def validate_with_options!(key, to, with)
  return true if to
  if !with.empty? && (with[:from].nil? || with[:to].nil?)
    raise IncorrectMappingArgumentsError.new(
      ":with argument for mapping '#{key}' requires :to and :from keys",
    )
  end
end