defmodule ProxmoxAgent.Shell do @moduledoc """ Thin wrapper over System.cmd for testability. Collectors accept an optional :runner function of this shape so tests can inject fixture-backed fakes. """ @type result :: {:ok, String.t()} | {:error, term()} @spec run(String.t(), [String.t()]) :: result def run(command, args) do try do case System.cmd(command, args, stderr_to_stdout: true) do {output, 0} -> {:ok, output} {output, code} -> {:error, {:nonzero_exit, code, output}} end rescue e in ErlangError -> case e.original do :enoent -> {:error, {:enoent, command}} other -> {:error, {:system_error, other}} end end end end