Crate indenter

Source
Expand description

A few wrappers for the fmt::Write objects that efficiently appends and remove common indentation after every newline

§Setup

Add this to your Cargo.toml:

[dependencies]
indenter = "0.2"

§Examples

§Indentation only

This type is intended primarily for writing error reporters that gracefully format error messages that span multiple lines.

use std::error::Error;
use core::fmt::{self, Write};
use indenter::indented;

struct ErrorReporter<'a>(&'a dyn Error);

impl fmt::Debug for ErrorReporter<'_> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        let mut source = Some(self.0);
        let mut i = 0;

        while let Some(error) = source {
            writeln!(f)?;
            write!(indented(f).ind(i), "{}", error)?;

            source = error.source();
            i += 1;
        }

        Ok(())
    }
}

§“Dedenting” (removing common leading indendation)

This type is intended primarily for formatting source code. For example, when generating code.

This type requires the feature std.

use std::error::Error;
use core::fmt::{self, Write};
use indenter::CodeFormatter;

let mut output = String::new();
let mut f = CodeFormatter::new(&mut output, "    ");

write!(
    f,
    r#"
    Hello
        World
    "#,
);

assert_eq!(output, "Hello\n    World\n");

let mut output = String::new();
let mut f = CodeFormatter::new(&mut output, "    ");

// it can also indent...
f.indent(2);

write!(
    f,
    r#"
    Hello
        World
    "#,
);

assert_eq!(output, "        Hello\n            World\n");

Structs§

CodeFormatter
Helper struct for efficiently dedent and indent multi line display implementations
Indented
Helper struct for efficiently indenting multi line display implementations

Enums§

Format
The set of supported formats for indentation

Functions§

indented
Helper function for creating a default indenter

Type Aliases§

Inserter
A callback for Format::Custom used to insert indenation after a new line