Crate indoc[−][src]
This crate provides a procedural macro for indented string literals. The
indoc!()
macro takes a multiline string literal and un-indents it so the
leftmost non-space character is in the first column.
[dependencies]
indoc = "0.2"
Release notes are available under GitHub releases.
Using Indoc
#[macro_use] extern crate 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:
#[macro_use] extern crate 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:
#[macro_use] extern crate 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[..]); }
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.
This means there are a few equivalent ways to format the same string, so choose
one you like. All of the following result in the string "line one\nline two\n"
:
indoc!(" / indoc!( / indoc!("line one
line one / "line one / line two
line two / line two / ")
") / ") /
Re-exports
pub extern crate indoc_impl; |