Crate ptree[][src]

Expand description

Pretty-print tree-like structures

Basic usage

// Build a tree using a TreeBuilder
let tree = TreeBuilder::new("tree".to_string())
    .begin_child("branch".to_string())
        .add_empty_child("leaf".to_string())
    .end_child()
    .add_empty_child("empty branch".to_string())
    .build();

// Print out the tree using default formatting
print_tree(&tree)?;

Output configuration

Ptree allows user configuration of the output format. Thus any program using the library can be configured globaly, providing a consistent user experience.

Output formatting is controlled by a user configuration file or by environment variables.


indent = 4

[branch]
foreground = red
dimmed = true

[leaf]
bold = true

The configuration file resides in the platform-specific user configuration directory, as returned by config_dir. It can be in TOML, YAML, INI or JSON format, provided the file stem is ptree. A custom configuration file can be specified by setting the PTREE_CONFIG environment variable to the full path of the file.

Individual configuration parameters can also be overriden using environment variables.

PTREE_INDENT=3 PTREE_BRANCH_BACKGROUND=yellow <command>

See PrintConfig for the list of all configuration options.

Advanced usage

Implementing the TreeItem trait

Rather than construct a new tree, one can implement the TreeItem trait for a custom data structure.

#[derive(Clone)]
struct MyCustomTree {}

impl TreeItem for MyCustomTree {
    type Child = Self;
    fn write_self<W: io::Write>(&self, f: &mut W, style: &Style) -> io::Result<()> {
        write!(f, "{}", style.paint("My custom tree"))
    }
    fn children(&self) -> Cow<[Self::Child]> {
        Cow::from(vec![])
    }
}

// Build my custom tree structure
let tree = MyCustomTree {};

// Print out the tree using default formatting
print_tree(&tree)?;

Custom output formatting

The print_tree function loads the user configuration to control output formatting. If you want to override this, you can create your own PrintConfig and use the print_tree_with function.

// Build a tree using a TreeBuilder
let tree = TreeBuilder::new("tree".to_string())
    .add_empty_child("empty branch".to_string())
    .build();

// Set up the print configuration
let config = {
    let mut config = PrintConfig::from_env();
    config.branch = Style {
        foreground: Some(Color::Red),
        background: Some(Color::Yellow),
        dimmed: true,
        ..Style::default()
    };
    config.leaf = Style {
        bold: true,
        ..Style::default()
    };
    config.characters = UTF_CHARS_BOLD.into();
    config.indent = 4;
    config
};

// Print out the tree using custom formatting
print_tree_with(&tree, &config)?;

Write to a file

To write a tree to a file rather than to standard output, use write_tree or write_tree_with.

Unless PrintConfig::styled is set to Always, these two functions will not use ANSI coloring and styling for the output text.

// Build a tree using a TreeBuilder
let tree = TreeBuilder::new("tree".to_string())
    .add_empty_child("empty branch".to_string())
    .build();

// Open a file for writing
let file_name = "tree.txt";
let file = File::create(&file_name)?;

// Write out the tree to the file
write_tree(&tree, file)?;

Re-exports

pub use builder::TreeBuilder;
pub use item::TreeItem;
pub use output::print_tree;
pub use output::print_tree_with;
pub use output::write_tree;
pub use output::write_tree_with;
pub use print_config::IndentChars;
pub use print_config::PrintConfig;
pub use style::Color;
pub use style::Style;

Modules

Contains the TreeBuilder structure, useful for manually constructing trees

Implementation of TreeItem for petgraph::Graph

Contains the TreeItem trait

Functions for printing trees to standard output or to custom writers

Structures to control the output formatting

Structures to control terminal colors and styles

Implementation of TreeItem for serde_value::Value, allowing easy printing of deserialized structures from a variety of formats.