8 releases
0.3.3 | Feb 22, 2021 |
---|---|
0.3.2 | Jan 4, 2021 |
0.3.1 | Dec 21, 2020 |
0.3.0 | May 17, 2020 |
0.1.1 | Feb 28, 2020 |
#30 in Text processing
1,521,377 downloads per month
Used in 2,180 crates
(37 directly)
21KB
349 lines
indenter
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 std::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");
License
Licensed under either of Apache License, Version 2.0 or MIT license at your option.Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.