View Source Nexus (nexus_cli v0.5.0)
Nexus is a comprehensive toolkit for building Command-Line Interfaces (CLI) and Terminal User Interfaces (TUI) in Elixir. It provides a unified framework that simplifies the development of interactive applications running in the terminal.
Overview
The Nexus ecosystem is designed to be modular and extensible, comprising different namespaces to organize its functionalities:
Nexus.CLI
: Tools and macros for building robust command-line interfaces.Nexus.TUI
: (Upcoming) A toolkit leveraging Phoenix LiveView and The Elm Architecture (TEA) to create rich terminal user interfaces.
By leveraging Elixir's strengths and integrating with powerful frameworks like Phoenix LiveView, Nexus aims to streamline the process of creating both CLIs and TUIs with minimal boilerplate and maximum flexibility.
Features
- Declarative Command Definitions: Use expressive macros to define commands, subcommands, arguments, and flags in a clean and readable manner.
- Automatic Help Generation: Automatically generate help messages and usage instructions based on your command definitions.
- Extensible Architecture: Designed to be extended and integrated with other tools, making it adaptable to a wide range of applications.
Getting Started with Nexus
To start using Nexus for building CLIs, add it as a dependency in your mix.exs
file:
def deps do
[
{:nexus_cli, "~> 0.5"}
]
end
Then, create your CLI module:
defmodule MyCLI do
use Nexus.CLI, otp_app: :my_app
# no value root command
defcommand :version do
description "Shows the program version"
end
# nested subcommand
defcommand :file do
description "Performs file operations such as copy, move, and delete."
# multi value nested subcommand
subcommand :copy do
description "Copies files from source to destination."
value :string, required: true, as: :source
value :string, required: true, as: :dest
flag :verbose do
short :v
description "Enables verbose output."
end
flag :recursive do
short :r
description "Copies directories recursively."
end
end
# Define more subcommands as needed
end
@impl Nexus.CLI
def handle_input(:version, %{value: true}) do
# `version/1` is auto injected or you can define the callback yourself
IO.puts(version())
end
def handle_input([:file, :copy], %{args: args, flags: flags}) do
if flags[:verbose] do
IO.puts("Copying from #{args[:source]} to #{args[:dest]}...")
end
with {:error, reason} <- do_copy(args) do
{:error, {1, reason}}
end
end
@spec do_copy(map) :: :ok | {:error, term}
defp do_copy(%{source: _, dest: _}) do
# Implement the copy logic here
end
end
Check Nexus.CLI
module for more information about callbacks and function returns
Get started today and build amazing CLI and TUI applications with Nexus!