Expand description
This crate provides a procedural macro for indented string literals. The
indoc!() macro takes a multiline string literal and un-indents it at
compile time so the leftmost non-space character is in the first column.
[dependencies]
indoc = "1.0"
Using indoc
use indoc::indoc;
fn main() {
let testing = indoc! {"
def hello():
print('Hello, world!')
hello()
"};
let expected = "def hello():\n print('Hello, world!')\n\nhello()\n";
assert_eq!(testing, expected);
}Indoc also works with raw string literals:
use indoc::indoc;
fn main() {
let testing = indoc! {r#"
def hello():
print("Hello, world!")
hello()
"#};
let expected = "def hello():\n print(\"Hello, world!\")\n\nhello()\n";
assert_eq!(testing, expected);
}And byte string literals:
use indoc::indoc;
fn main() {
let testing = indoc! {b"
def hello():
print('Hello, world!')
hello()
"};
let expected = b"def hello():\n print('Hello, world!')\n\nhello()\n";
assert_eq!(testing[..], expected[..]);
}Formatting macros
The indoc crate exports four additional macros to substitute conveniently for the standard library’s formatting macros:
formatdoc!($fmt, ...)— equivalent toformat!(indoc!($fmt), ...)printdoc!($fmt, ...)— equivalent toprint!(indoc!($fmt), ...)eprintdoc!($fmt, ...)— equivalent toeprint!(indoc!($fmt), ...)writedoc!($dest, $fmt, ...)— equivalent towrite!($dest, indoc!($fmt), ...)
use indoc::printdoc;
fn main() {
printdoc! {"
GET {url}
Accept: {mime}
",
url = "http://localhost:8080",
mime = "application/json",
}
}Explanation
The following rules characterize the behavior of the indoc!() macro:
- Count the leading spaces of each line, ignoring the first line and any lines that are empty or contain spaces only.
- Take the minimum.
- If the first line is empty i.e. the string begins with a newline, remove the first line.
- Remove the computed number of spaces from the beginning of each line.
Macros
- Unindent and call
eprint!. - Unindent and call
format!. - Unindent and produce
&'static str. - Unindent and call
print!. - Unindent and call
write!.