Crate indoc[−][src]
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.