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/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