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
- Helper struct for efficiently indenting multi line display implementations
Enums
- The set of supported formats for indentation
Functions
- Helper function for creating a default indenter
Type Aliases
- A callback for
Format::Custom
used to insert indenation after a new line