Packages
Multi-surface application runtime for Elixir. One TEA module renders to terminal, browser (LiveView), SSH, and MCP (agents). 30+ widgets, flexbox + CSS grid, AI agent runtime, distributed swarm with CRDTs, time-travel debugging, session recording, sandboxed REPL, and agentic commerce.
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