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
raxol_terminal lib raxol terminal parser state manager_refactored.ex
Raw

lib/raxol/terminal/parser/state/manager_refactored.ex

defmodule Raxol.Terminal.Parser.State.ManagerRefactored do
@moduledoc """
Refactored version of Terminal Parser State Manager using pattern matching
instead of cond statements.
This demonstrates Sprint 9's pattern matching improvements.
"""
defstruct [
:state,
:params,
:intermediate,
:ignore,
:osc_buffer,
:dcs_buffer,
:apc_buffer,
:pm_buffer,
:sos_buffer,
:string_buffer,
:string_terminator,
:string_flags,
:string_parser_state,
:params_buffer,
:intermediates_buffer,
:payload_buffer,
:final_byte,
:designating_gset,
:single_shift
]
@type parser_state ::
:ground
| :escape
| :csi_entry
| :csi_param
| :csi_intermediate
| :csi_ignore
| :osc_string
| :dcs_entry
| :dcs_param
| :dcs_intermediate
| :dcs_passthrough
| :apc_string
| :pm_string
| :sos_string
| :string
@type t :: %__MODULE__{
state: parser_state(),
params: list(),
intermediate: list()
# ... other fields
}
# Character ranges
# Unused constants (commented out since functions are commented out)
# @c0_range 0x00..0x1F
# @c1_range 0x80..0x9F
# @printable_range 0x20..0x7E
# @extended_range 0xA0..0xFF
# @st 0x9C
# Replace cond with pattern matching function heads
# Ground state processing (commented out unused functions)
# defp process_ground_state(manager, char) when char in @c0_range,
# do: handle_c0_control(manager, char)
# defp process_ground_state(manager, char) when char in @c1_range,
# do: handle_c1_control(manager, char)
# defp process_ground_state(manager, char) when char in @printable_range,
# do: handle_printable(manager, char)
# defp process_ground_state(manager, char) when char in @extended_range,
# do: handle_extended(manager, char)
# defp process_ground_state(manager, _char), do: manager
# Escape state processing
# defp process_escape_state(manager, char) when char in @c0_range,
# do: handle_c0_control(manager, char)
# defp process_escape_state(manager, char) when char in @c1_range,
# do: handle_c1_control(manager, char)
# defp process_escape_state(manager, char) when char in @printable_range,
# do: handle_escape_printable(manager, char)
# defp process_escape_state(manager, char) when char in @extended_range,
# do: handle_escape_extended(manager, char)
# defp process_escape_state(manager, _char), do: manager
# CSI Entry state processing - using guards instead of cond
# defp process_csi_entry_state(manager, char) when char in 0x30..0x3F//1,
# do: set_state(manager, :csi_param)
# defp process_csi_entry_state(manager, char) when char in 0x20..0x2F//1,
# do: set_state(manager, :csi_intermediate)
# defp process_csi_entry_state(manager, char) when char in 0x40..0x7E//1,
# do: set_state(manager, :ground)
# defp process_csi_entry_state(manager, _char),
# do: set_state(manager, :csi_ignore)
# CSI Param state processing
# defp process_csi_param_state(manager, char) when char in 0x30..0x3F//1,
# do: manager
# defp process_csi_param_state(manager, char) when char in 0x20..0x2F//1,
# do: set_state(manager, :csi_intermediate)
# defp process_csi_param_state(manager, char) when char in 0x40..0x7E//1,
# do: set_state(manager, :ground)
# defp process_csi_param_state(manager, _char),
# do: set_state(manager, :csi_ignore)
# CSI Intermediate state processing
# defp process_csi_intermediate_state(manager, char) when char in 0x20..0x2F//1,
# do: manager
# defp process_csi_intermediate_state(manager, char) when char in 0x40..0x7E//1,
# do: set_state(manager, :ground)
# defp process_csi_intermediate_state(manager, _char),
# do: set_state(manager, :csi_ignore)
# CSI Ignore state - already uses if, but can be pattern matched
# defp process_csi_ignore_state(manager, char) when char in 0x40..0x7E//1,
# do: set_state(manager, :ground)
# defp process_csi_ignore_state(manager, _char), do: manager
# DCS Entry state processing
# defp process_dcs_entry_state(manager, char) when char in 0x30..0x3F//1,
# do: set_state(manager, :dcs_param)
# defp process_dcs_entry_state(manager, char) when char in 0x20..0x2F//1,
# do: set_state(manager, :dcs_intermediate)
# defp process_dcs_entry_state(manager, char) when char in 0x40..0x7E//1,
# do: set_state(manager, :dcs_passthrough)
# defp process_dcs_entry_state(manager, _char),
# do: set_state(manager, :ground)
# DCS Param state processing
# defp process_dcs_param_state(manager, char) when char in 0x30..0x3F//1,
# do: manager
# defp process_dcs_param_state(manager, char) when char in 0x20..0x2F//1,
# do: set_state(manager, :dcs_intermediate)
# defp process_dcs_param_state(manager, char) when char in 0x40..0x7E//1,
# do: set_state(manager, :dcs_passthrough)
# defp process_dcs_param_state(manager, _char),
# do: set_state(manager, :ground)
# DCS Intermediate state processing
# defp process_dcs_intermediate_state(manager, char) when char in 0x20..0x2F//1,
# do: manager
# defp process_dcs_intermediate_state(manager, char) when char in 0x40..0x7E//1,
# do: set_state(manager, :dcs_passthrough)
# defp process_dcs_intermediate_state(manager, _char),
# do: set_state(manager, :ground)
# DCS Passthrough state - pattern match on ST character
# defp process_dcs_passthrough_state(manager, @st),
# do: set_state(manager, :ground)
# defp process_dcs_passthrough_state(manager, _char), do: manager
# Example of refactoring nested if/else to with statement
def parse_sequence(manager, input) do
with {:ok, validated} <- validate_input(input),
{:ok, preprocessed} <- preprocess(validated),
{:ok, parsed} <- do_parse(manager, preprocessed) do
{:ok, parsed}
else
{:error, _reason} = error -> error
end
end
# Helper functions (stubs for demonstration - commented out unused functions)
# defp set_state(manager, state), do: %{manager | state: state}
# defp handle_c0_control(manager, _char), do: manager
# defp handle_c1_control(manager, _char), do: manager
# defp handle_printable(manager, _char), do: manager
# defp handle_extended(manager, _char), do: manager
# defp handle_escape_printable(manager, _char), do: manager
# defp handle_escape_extended(manager, _char), do: manager
defp validate_input(input), do: {:ok, input}
defp preprocess(input), do: {:ok, input}
defp do_parse(_manager, input), do: {:ok, input}
end