unfmt 0.3.2

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

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 mut subject = None;
let mut object = None;
assert_eq!(
    unformat!("My {subject} is {object}.", value),
    Some(())
);
assert_eq!((subject, object), (Some("name"), Some("Rho")));

// If you want to ensure the entire string matches, you can add `true` to the end of the macro.
assert_eq!(unformat!("{1} is {0}", value, true), None);

// 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.

Contributing

Start with a Discussion instead of opening a pull request. If we accept the proposal, a Mathematic maintainer or agent will implement it. When we implement your proposal, the pull request will link to the Discussion and credit you as the proposal's original author. GitHub restricts pull request creation to Mathematic maintainers and repository collaborators with write, maintain, or admin access, plus authorized maintenance agents. See CONTRIBUTING.md for the full process.

This project is free and open-source work by a 501(c)(3) non-profit. If you find it useful, please consider donating.