_      __
|\ ||_\/| |(_
| \||_/\|_|__)

Create CLIs in a magic and declarative way!

A pure Elixir library to write command line apps in a cleaner and elegant way!

Hex.pm Downloads Documentation ci

Installation

Just add the nexus_cli package to your mix.exs

def deps do
  [
    {:nexus_cli, "~> 0.5.0"} # x-release-version
  ]
end

Example

defmodule MyCLI do
  @moduledoc "This will be used into as help"

  use Nexus.CLI

  defcommand :fizzbuzz do
    description "Plays fizzbuzz - this will also be used as help"

    value :integer, required: true
  end

  @impl Nexus.CLI
  def handle_input(:fizzbuzz, %{value: value}) when is_integer(value) do
    cond do
      rem(value, 3) == 0 and rem(value, 5) == 0 -> IO.puts("fizzbuzz")
      rem(value, 3) == 0 -> IO.puts("fizz")
      rem(value, 5) == 0 -> IO.puts("buzz")
      true -> IO.puts value
    end
  end
end

More different ways to use this library can be found on the examples folder Documentation on defining a CLI module can be found at the Nexus.CLI

Roadmap

FeatureStatusDescription
Core Nexus.CLI Implementationβœ… CompletedBase implementation of the Nexus.CLI module with macro-based DSL for defining CLIs.
Automatic Help Generationβœ… CompletedAutomatically generate help messages based on command definitions.
Command Parsing and Dispatchingβœ… CompletedParse user input and dispatch commands to the appropriate handlers.
Nexus.TUI Development🚧 In ProgressBuild the Nexus.TUI module leveraging Phoenix LiveView and TEA for terminal UIs.
TUI Component LibraryπŸ”œ PlannedDevelop reusable components for building terminal UIs.
Integration with Phoenix LiveViewπŸ”œ PlannedIntegrate Nexus.TUI with Phoenix LiveView for live terminal experiences.
Community Contributions♾️ OngoingEncourage and incorporate feedback and contributions from the community.

Features

  • Macro based DSL
    • [x] define global/root commands
    • [x] define subcommands (supporting nesting)
    • [x] define flags
    • [ ] define global/root flags
  • [x] Automatic help flags generation

Why "Nexus"

Nexus is a connection from two different worlds! This library connects the world of CLIs with the magic world of Elixir!

Inspirations

Highly inspired in clap-rs