Command Parser
View SourceCLI with tab completion, history, and argument parsing.
Usage
alias Raxol.Command.Parser
parser =
Parser.new()
|> Parser.register_command("echo", fn args ->
{:ok, Enum.join(args, " ")}
end)
|> Parser.register_alias("e", "echo")
{:ok, result, parser} = Parser.parse_and_execute(parser, "echo Hello")Registration
# Command with validation
parser = Parser.register_command(parser, "add", fn args ->
case args do
[a, b] ->
{:ok, String.to_integer(a) + String.to_integer(b)}
_ ->
{:error, "Usage: add <n1> <n2>"}
end
end)
# Alias
parser = Parser.register_alias(parser, "ls", "list")Arguments
# Quoted strings
Parser.parse_and_execute(parser, ~s(echo "Hello World" test))
# args => ["Hello World", "test"]
# Multiple arguments
Parser.parse_and_execute(parser, "join one two three")Interactive Mode
# Tab completion
parser = %{parser | input: "ech"}
parser = Parser.handle_key(parser, "Tab") # Completes to "echo"
# History navigation
parser = Parser.handle_key(parser, "ArrowUp") # Previous
parser = Parser.handle_key(parser, "ArrowDown") # Next
# History search (Ctrl+R)
parser = Parser.handle_key(parser, "Ctrl+R")
# Type search query, press Enter
# Execute
parser = Parser.handle_key(parser, "Enter")Integration
def handle_key(state, key) do
parser = Parser.handle_key(state.parser, key)
# Check if command executed
case Parser.get_input(parser) do
"" -> handle_result(state, parser)
_ -> %{state | parser: parser}
end
endPerformance: ~5μs per command