Packages
Terminal emulation and driver infrastructure for Raxol. ANSI parsing, screen buffers, command processing, cursor management, input handling, session management, and termbox2 NIF integration.
Current section
Files
Jump to
Current section
Files
lib/raxol/terminal/commands/processor.ex
defmodule Raxol.Terminal.Commands.Processor do
@moduledoc """
Handles command processing for the terminal emulator.
This module is responsible for parsing, validating, and executing terminal commands.
"""
alias Raxol.Terminal.Commands.{
Executor,
ParameterValidation
}
alias Raxol.Terminal.Commands.CommandsParser, as: Parser
alias Raxol.Terminal.Emulator
@doc """
Processes a command string and executes it on the emulator.
Returns {:ok, updated_emulator} or {:error, reason}.
"""
@spec process_command(Emulator.t(), String.t()) ::
{:ok, Emulator.t()} | {:error, String.t()}
def process_command(emulator, command) when is_binary(command) do
case Parser.parse(command) do
{:ok, parsed_command} ->
execute_command(emulator, parsed_command)
{:error, reason} ->
{:error, "Failed to parse command: #{inspect(reason)}"}
end
end
@doc """
Executes a parsed command on the emulator.
Returns {:ok, updated_emulator} or {:error, reason}.
"""
@spec execute_command(Emulator.t(), map()) ::
{:ok, Emulator.t()} | {:error, String.t()}
def execute_command(emulator, %{type: :csi} = command) do
Executor.execute_csi_command(
emulator,
command.params_buffer,
command.intermediates_buffer,
command.final_byte
)
end
def execute_command(emulator, %{type: :osc} = command) do
Executor.execute_osc_command(
emulator,
command.command,
command.params
)
end
def execute_command(emulator, %{type: :dcs} = command) do
Executor.execute_dcs_command(
emulator,
command.params_buffer || "",
command.intermediates_buffer || "",
command.data_string || ""
)
end
def execute_command(_emulator, invalid_command) do
{:error, "Invalid command type: #{inspect(invalid_command)}"}
end
@doc """
Validates command parameters against the emulator's current state.
Returns {:ok, validated_params} or {:error, reason}.
"""
@spec validate_parameters(Emulator.t(), list(), atom()) ::
{:ok, list()} | {:error, String.t()}
def validate_parameters(emulator, params, command_type) do
case command_type do
:cursor ->
{:ok, ParameterValidation.validate_coordinates(emulator, params)}
:screen ->
{:ok, ParameterValidation.validate_count(emulator, params)}
:mode ->
{:ok, ParameterValidation.validate_mode(params)}
:color ->
{:ok, ParameterValidation.validate_color(params)}
_ ->
{:ok, params}
end
end
@doc """
Handles command execution errors.
Returns {:ok, updated_emulator} with error state or {:error, reason}.
"""
@spec handle_command_error(Emulator.t(), String.t()) ::
{:ok, Emulator.t()} | {:error, String.t()}
def handle_command_error(emulator, reason) do
Raxol.Core.Runtime.Log.error("Command execution error: #{reason}")
{:ok, emulator}
end
end