#repl #shell #terminal #cli

revolver

A library for building REPL applications

2 unstable releases

0.2.0 Dec 22, 2022
0.1.0 Nov 24, 2022

#51 in #repl


Used in sequent-repl

MIT license

80KB
2K SLoC

Revolver

A library for building REPL applications.

Crates.io docs.rs Build Status codecov

Concepts

Command

The Command trait is a specification of an executable command — the 'execute' part of a REPL application. A command will typically be accompanied by a NamedCommandParser implementation for converting command strings into Command objects.

Commands and NamedCommandParsers are the only two traits that you must implement. Everything else is just configuration.

Commander

A Commander decodes user input (typically a line read from a terminal interface) into a dynamic Command object, using a preconfigured map of NamedCommandParsers.

Built-in commands

Revolver comes with two useful built-in commands that can be used out-of-the-box.

  • help — A self-help guide, outlining the available commands and how to use them.
  • quit — Terminates the REPL. (It only exits the loop; it does not terminate the application.)

These commands are opt-in, meaning that you must explicitly include their parsers in your Commander to enable them.

Terminal

The Terminal trait represents a text-based interface with the user. It fulfils the 'read' and 'print' parts of a REPL application.

Revolver is currently bundled with two Terminal implementations:

  • Streaming — A terminal device that composes over I/O streams using Input and Output traits. Out-of-the-box adapters exist for stdin and stdout streams. Adapters may be written to interface with nonstandard streams by supplying a custom closure.
  • Mock — A way of mocking a terminal device for feeding input, capturing output, and performing various assertions.

Looper

Looper is a mechanism for iteratively running commands based on successive user input. It fulfils the 'loop' part of a REPL application.

Getting started

Add dependency

cargo add revolver

An example

See examples/calculator.rs for a simple calculator REPL.

Dependencies

~0.4–0.8MB
~19K SLoC