defmodule Drone.Adapters.Tello.Parser do @moduledoc """ Parses Tello UDP response strings into structured responses. Tello responses are plain ASCII: `ok`, `error`, or numeric values for query commands. """ @type parse_result :: {:ok, :ok} | {:ok, integer()} | {:ok, String.t()} | {:error, :command_error} | {:error, :timeout} | {:error, :socket_error} @spec parse(binary()) :: parse_result() def parse(response) when is_binary(response) do trimmed = String.trim(response) cond do trimmed == "ok" -> {:ok, :ok} trimmed == "error" -> {:error, :command_error} match = Regex.run(~r/^(-?\d+)$/, trimmed) -> {:ok, String.to_integer(Enum.at(match, 1))} byte_size(trimmed) > 0 -> {:ok, trimmed} true -> {:error, :command_error} end end def parse(nil), do: {:error, :timeout} def parse(:timeout), do: {:error, :timeout} end