| Crates.io | indoc |
| lib.rs | indoc |
| version | 2.0.6 |
| created_at | 2016-03-19 07:03:31.602187+00 |
| updated_at | 2025-03-03 23:32:31.175928+00 |
| description | Indented document literals |
| homepage | |
| repository | https://github.com/dtolnay/indoc |
| max_upload_size | |
| id | 4483 |
| size | 59,555 |
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));
}