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 = "2"
Compiler requirement: rustc 1.56 or greater.
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[..]); }
The indoc crate exports five additional macros to substitute conveniently for the standard library's formatting macros:
formatdoc!($fmt, ...) — equivalent to format!(indoc!($fmt), ...)printdoc!($fmt, ...) — equivalent to print!(indoc!($fmt), ...)eprintdoc!($fmt, ...) — equivalent to eprint!(indoc!($fmt), ...)writedoc!($dest, $fmt, ...) — equivalent to write!($dest, indoc!($fmt), ...)concatdoc!(...) — equivalent to concat!(...) with each string literal wrapped in indoc!use indoc::{concatdoc, printdoc}; const HELP: &str = concatdoc! {" Usage: ", env!("CARGO_BIN_NAME"), " [options] Options: -h, --help "}; fn main() { printdoc! {" GET {url} Accept: {mime} ", url = "http://localhost:8080", mime = "application/json", } }
The following rules characterize the behavior of the indoc!() macro:
Indoc's indentation logic is available in the unindent crate. This may be useful for processing strings that are not statically known at compile time.
The crate exposes two functions:
unindent(&str) -> Stringunindent_bytes(&[u8]) -> Vec<u8>use unindent::unindent; fn main() { let indented = " line one line two"; assert_eq!("line one\nline two", unindent(indented)); }