class Lutaml::Model::KeyValueMapping

def deep_dup

def deep_dup
  self.class.new(@format).tap do |new_mapping|
    new_mapping.instance_variable_set(:@mappings, duplicate_mappings)
  end
end

def duplicate_mappings

def duplicate_mappings
  @mappings.map(&:deep_dup)
end

def find_by_to(to)

def find_by_to(to)
  @mappings.find { |m| m.to.to_s == to.to_s }
end

def initialize(format = nil)

def initialize(format = nil)
  super()
  @format = format
end

def map(

def map(
  name = nil,
  to: nil,
  render_nil: false,
  render_default: false,
  render_empty: false,
  treat_nil: nil,
  treat_empty: nil,
  treat_omitted: nil,
  with: {},
  delegate: nil,
  child_mappings: nil,
  root_mappings: nil,
  polymorphic: {},
  polymorphic_map: {},
  transform: {},
  value_map: {}
)
  mapping_name = name_for_mapping(root_mappings, name)
  validate!(mapping_name, to, with, render_nil, render_empty)
  @mappings << KeyValueMappingRule.new(
    mapping_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,
    child_mappings: child_mappings,
    root_mappings: root_mappings,
    polymorphic: polymorphic,
    polymorphic_map: polymorphic_map,
    transform: transform,
    value_map: value_map,
  )
end

def map_all(

def map_all(
  to: nil,
  render_nil: false,
  render_default: false,
  with: {},
  delegate: nil
)
  @raw_mapping = true
  validate!(Constants::RAW_MAPPING_KEY, to, with, render_nil, nil)
  @mappings << KeyValueMappingRule.new(
    Constants::RAW_MAPPING_KEY,
    to: to,
    render_nil: render_nil,
    render_default: render_default,
    with: with,
    delegate: delegate,
  )
end

def name_for_mapping(root_mappings, name)

def name_for_mapping(root_mappings, name)
  return "root_mapping" if root_mappings
  name
end

def polymorphic_mapping

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

def validate!(key, to, with, render_nil, render_empty)

def validate!(key, to, with, render_nil, render_empty)
  validate_mappings!(key)
  validate_to_and_with_arguments!(key, to, with)
  # Validate `render_nil` for unsupported value
  validate_blank_mappings!(render_nil, render_empty)
  validate_root_mappings!(key)
end

def validate_blank_mappings!(render_nil, render_empty)

def validate_blank_mappings!(render_nil, render_empty)
  if render_nil == :as_blank || render_empty == :as_blank
    raise IncorrectMappingArgumentsError.new(
      ":as_blank is not supported for key-value mappings",
    )
  end
end

def validate_mappings!(_type)

def validate_mappings!(_type)
  if (@raw_mapping && Utils.present?(@mappings)) || (!@raw_mapping && @mappings.any?(&:raw_mapping?))
    raise StandardError, "map_all is not allowed with other mappings"
  end
end

def validate_root_mappings!(name)

def validate_root_mappings!(name)
  if @mappings.any?(&:root_mapping?) || (name == "root_mapping" && @mappings.any?)
    raise MultipleMappingsError.new("root_mappings cannot be used 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? && !@raw_mapping
    raise IncorrectMappingArgumentsError.new(
      ":to or :with argument is required for mapping '#{key}'",
    )
  end
  validate_with_options!(to, key, with)
end

def validate_with_options!(to, key, with)

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