Skip to main content

lib/drone/adapters/tello/parser.ex

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