A few wrappers for the fmt::Write
objects that efficiently appends and remove
common indentation after every newline
Add this to your Cargo.toml
:
[dependencies]
indenter = "0.2"
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(())
}
}
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");
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.