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
raxol lib raxol terminal commands parameter_validation.ex
Raw

lib/raxol/terminal/commands/parameter_validation.ex

defmodule Raxol.Terminal.Commands.ParameterValidation do
@moduledoc false
import Raxol.Guards
require Raxol.Core.Runtime.Log
@spec get_valid_param(
list(integer() | nil),
non_neg_integer(),
integer(),
integer(),
integer()
) :: integer()
def get_valid_param(params, index, default, min, max) do
case Enum.at(params, index, default) do
value when integer?(value) and value >= min and value <= max ->
value
_ ->
Raxol.Core.Runtime.Log.warning_with_context(
"Invalid parameter value at index #{index}, using default #{default}",
%{params: params, index: index, default: default, min: min, max: max}
)
default
end
end
@spec get_valid_non_neg_param(
list(integer() | nil),
non_neg_integer(),
non_neg_integer()
) :: non_neg_integer()
def get_valid_non_neg_param(params, index, default) do
get_valid_param(params, index, default, 0, 9999)
end
@spec get_valid_pos_param(
list(integer() | nil),
non_neg_integer(),
pos_integer()
) :: pos_integer()
def get_valid_pos_param(params, index, default) do
get_valid_param(params, index, default, 1, 9999)
end
@spec get_valid_bool_param(list(integer() | nil), non_neg_integer(), 0..1) ::
0..1
def get_valid_bool_param(params, index, default) do
get_valid_param(params, index, default, 0, 1)
end
def validate_coordinates(emulator, params) do
{max_x, max_y} = get_dimensions(emulator)
x = validate_coordinate(Enum.at(params, 0), max_x)
y = validate_coordinate(Enum.at(params, 1), max_y)
{x, y}
end
defp get_dimensions(emulator) do
width = get_dimension(emulator, :width, 0)
height = get_dimension(emulator, :height, 1)
{width - 1, height - 1}
end
defp get_dimension(emulator, key, tuple_index) do
cond do
map?(emulator) -> Map.get(emulator, key, 10)
tuple?(emulator) -> elem(emulator, tuple_index)
true -> 10
end
end
defp validate_coordinate(value, max) do
cond do
integer?(value) and value < 0 -> 0
integer?(value) and value > max -> max
integer?(value) -> value
true -> 0
end
end
def validate_count(_emulator, params) do
case Enum.at(params, 0) do
v when integer?(v) and v >= 1 and v <= 10 -> v
v when integer?(v) and v < 1 -> 1
v when integer?(v) and v > 10 -> 10
_ -> 1
end
end
def validate_mode(params) do
case Enum.at(params, 0) do
v when v in [0, 1, 2] -> v
_ -> 0
end
end
def validate_color(params) do
case Enum.at(params, 0) do
v when integer?(v) and v >= 0 and v <= 255 -> v
v when integer?(v) and v < 0 -> 0
v when integer?(v) and v > 255 -> 255
_ -> 0
end
end
@spec validate_boolean(list(integer() | nil)) :: boolean()
def validate_boolean(params) do
case Enum.at(params, 0) do
0 -> false
1 -> true
_ -> true
end
end
@spec normalize_parameters(list(integer() | nil), non_neg_integer()) ::
list(integer() | nil)
def normalize_parameters(params, expected_length) do
params
|> Enum.take(expected_length)
|> then(fn taken ->
taken ++ List.duplicate(nil, expected_length - length(taken))
end)
end
@spec validate_range(list(integer() | nil), integer(), integer()) :: integer()
def validate_range(params, min, max) do
value = Enum.at(params, 0)
if integer?(value), do: max(min, min(value, max)), else: min
end
end