Current section
Files
Jump to
Current section
Files
lib/bb/error/kinematics/multi_failed.ex
# SPDX-FileCopyrightText: 2025 James Harton
#
# SPDX-License-Identifier: Apache-2.0
defmodule BB.Error.Kinematics.MultiFailed do
@moduledoc """
Multi-target inverse kinematics failed.
Raised when a multi-target IK operation fails for one or more targets.
Contains the link that failed, the underlying error, and partial results
from any successful targets.
"""
use BB.Error,
class: :kinematics,
fields: [:failed_link, :error, :partial_results]
@type t :: %__MODULE__{
failed_link: atom(),
error: term(),
partial_results: map()
}
defimpl BB.Error.Severity do
def severity(_), do: :error
end
def message(%{failed_link: link, error: error, partial_results: results}) do
successful_count = map_size(results)
"Multi-target IK failed for #{inspect(link)}: #{format_error(error)}. " <>
"#{successful_count} target(s) solved before failure."
end
defp format_error(%{__struct__: _} = error), do: Exception.message(error)
defp format_error(error), do: inspect(error)
end