#pattern-matching #compile-time #regex #interpolation #unformat #format #process

no-std unfmt

A compile-time pattern matching library that reverses the interpolation process of format!

5 releases

0.2.2 May 14, 2024
0.2.1 May 4, 2024
0.1.2 Apr 15, 2024
0.1.1 Apr 14, 2024
0.1.0 Feb 11, 2024

#80 in Value formatting

Download history 23/week @ 2024-03-13 2/week @ 2024-03-20 5/week @ 2024-03-27 14/week @ 2024-04-03 275/week @ 2024-04-10 196/week @ 2024-04-17 168/week @ 2024-04-24 305/week @ 2024-05-01 184/week @ 2024-05-08 413/week @ 2024-05-15 194/week @ 2024-05-22 198/week @ 2024-05-29 96/week @ 2024-06-05 266/week @ 2024-06-12 475/week @ 2024-06-19 490/week @ 2024-06-26

1,353 downloads per month
Used in acknowledgements-rs

MIT/Apache

12KB

unfmt

crates.io license ci docs

unfmt is a compile-time pattern matching library that reverses the interpolation process of format!.

You can think of it as an extremely lightweight regular expression engine without the runtime pattern-compilation cost.

Installation

cargo add -D unfmt

Usage

let value = "My name is Rho.";

// Unnamed captures are returned as tuples.
assert_eq!(
    unformat!("My {} is {}.", value),
    Some(("name", "Rho"))
);

// You can put indices as well; just make sure ALL captures use indices
// otherwise it's not well defined.
assert_eq!(
    unformat!("My {1} is {0}.", value),
    Some(("Rho", "name"))
);

// You can also name captures using variables, but make sure you check the
// return is not None.
let subject;
let object;
assert_eq!(
    unformat!("My {subject} is {object}.", value),
    Some(())
);
assert_eq!((subject, object), (Some("name"), Some("Rho")));

// If a type implements `FromStr`, you can use it as a type argument. This
// is written as `{:Type}`.
assert_eq!(
    unformat!("Listening on {:url::Url}", "Listening on http://localhost:3000"),
    Some((url::Url::from_str("http://localhost:3000").unwrap(),))
);

In general, captures are written as {<index-or-variable>:<type>}. Multiple captures in a row (i.e. {}{}) are not supported as they aren't well-defined.

Limitations

  • There is no backtracking.

Dependencies

~0.8–1.4MB
~27K SLoC