2 unstable releases

0.2.0 Jun 5, 2023
0.1.0 Mar 22, 2022

#287 in Command-line interface

Download history 160/week @ 2023-12-18 100/week @ 2023-12-25 106/week @ 2024-01-01 112/week @ 2024-01-08 494/week @ 2024-01-15 238/week @ 2024-01-22 431/week @ 2024-01-29 412/week @ 2024-02-05 194/week @ 2024-02-12 341/week @ 2024-02-19 251/week @ 2024-02-26 221/week @ 2024-03-04 357/week @ 2024-03-11 463/week @ 2024-03-18 1215/week @ 2024-03-25 929/week @ 2024-04-01

2,980 downloads per month
Used in stoic

MIT/Apache

3MB
3.5K SLoC

A component-based framework for building Rust Text-based User Interfaces (TUIs)

There are several copies of this repo on GitHub, facebookincubator/superconsole is the canonical one.

The superconsole framework provides a powerful line based abstraction over text based rendering to the terminal. It also provides basic building blocks like line manipulation, and a higher level of composable components. A base set of "batteries" components are included to help developers create Text-based User Interfaces (TUIs) as quickly as possible.

The design choices that underly superconsole are selected to prioritize testability, ease of composition, and flexibility.

Superconsole also offers stylization, including italics, underlining, bolding, and coloring text. Furthermore, relying on crossterm ensures that it is compatible with Windows, Unix, and MacOS.

Finally, superconsole delineates between rendering logic and program state - each render call accepts an immutable reference to state, which components may use to inject state into their otherwise immutable rendering logic.

Demo

Superconsole running some buck2 tests

Examples

use std::convert::TryInto;
use superconsole::components::bordering::{Bordered, BorderedSpec};
use superconsole::{Component, Dimensions, DrawMode, Lines, SuperConsole};

#[derive(Debug)]
struct HelloWorld;

impl Component for HelloWorld {
    fn draw_unchecked(&self, _dimensions: Dimensions, _mode: DrawMode) -> anyhow::Result<Lines> {
        Ok(Lines(vec![
            vec!["Hello world!".to_owned()].try_into().unwrap(),
        ]))
    }
}

pub fn main() -> anyhow::Result<()> {
    let bordering = BorderedSpec::default();
    let mut superconsole = SuperConsole::new().ok_or_else(|| anyhow::anyhow!("Not a TTY"))?;
    let component = Bordered::new(HelloWorld, bordering);
    superconsole.render(&component)?;
    superconsole.finalize(&component)?;
    Ok(())
}

See the CONTRIBUTING file for how to help out.

License

Superconsole is both MIT and Apache License, Version 2.0 licensed, as found in the LICENSE-MIT and LICENSE-APACHE files.

Dependencies

~17–29MB
~482K SLoC