| Crates.io | indoc-impl |
| lib.rs | indoc-impl |
| version | 0.3.7 |
| created_at | 2017-09-17 17:45:50.745836+00 |
| updated_at | 2022-12-17 19:12:29.350677+00 |
| description | Indented document literals |
| homepage | |
| repository | https://github.com/dtolnay/indoc |
| max_upload_size | |
| id | 32067 |
| size | 21,433 |
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.3"
Release notes are available under GitHub releases.
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 following rules characterize the behavior of the indoc!() macro:
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 / ")
") / ") /
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));
}