# SPDX-FileCopyrightText: 2026 James Harton
#
# SPDX-License-Identifier: Apache-2.0
defmodule BB.MCP.Resources.RobotParameters do
@moduledoc """
All runtime parameters registered on a robot, with their current values.
Read via `bb://robots/{robot}/parameters`.
"""
use Anubis.Server.Component,
type: :resource,
uri_template: "bb://robots/{robot}/parameters",
name: "robot_parameters"
alias Anubis.Server.Response
alias BB.MCP.Resources
alias BB.Parameter
@impl true
def description, do: "All registered runtime parameters with current values"
@impl true
def mime_type, do: "application/json"
@impl true
def read(params, frame) do
case Resources.fetch_robot(params) do
{:ok, module} ->
payload =
module
|> Parameter.list()
|> Enum.map(&format_parameter/1)
{:reply, Response.json(Response.resource(), %{"parameters" => payload}), frame}
{:error, error} ->
{:error, error, frame}
end
end
defp format_parameter({path, metadata}) when is_map(metadata) do
base = %{
"path" => format_path(path),
"value" => Map.get(metadata, :value)
}
Enum.reduce([:type, :doc, :default, :required], base, fn key, acc ->
case Map.get(metadata, key) do
nil -> acc
value -> Map.put(acc, Atom.to_string(key), serialise(value))
end
end)
end
defp format_parameter({path, value}) do
%{"path" => format_path(path), "value" => value}
end
defp format_path(path), do: Enum.map_join(path, ".", &Atom.to_string/1)
defp serialise(value) when is_atom(value) and not is_boolean(value) and not is_nil(value),
do: Atom.to_string(value)
defp serialise(value) when is_tuple(value), do: inspect(value)
defp serialise(value), do: value
end