bird-machine

Compile your regular expressions at compile time.

Almost none of this has actually been implemented yet. Do not use this yet.

Example: find a date

```rust use birdmachine::{birdmachine, Machine};

[bird_machine(r"^\d{4}-\d{2}-\d{2}$")]

struct Date;

assert!(Date::is_match("2014-01-01")); ```

Example: iterating over capture groups

```rust use birdmachine::{birdmachine, Machine};

[bird_machine(r"(\d{4})-(\d{2})-(\d{2})")]

struct Date<'a>(&'a str, &'a str, &'a str); let input = "2012-03-14, 2013-01-01 and 2014-07-05"; let matchinfo = Date::capturesiter(input) .map(|x: Date| format!("Month: {} Day: {} Year: {}", x.1, x.2, x.0)); let expected = [ "Month: 03 Day: 14 Year: 2012", "Month: 01 Day: 01 Year: 2013", "Month: 07 Day: 05 Year: 2014", ]; for (actual, expected) in matchinfo.zip(expected) { asserteq!(actual, expected); } ```

Example: replacement with named capture groups

```rust use birdmachine::{birdmachine, Machine};

[bird_machine(r"(?P\d{4})-(?P\d{2})-(?P\d{2})")]

struct Date<'a> { y: &'a str, m: &'a str, d: &'a str, } let before = "2012-03-14, 2013-01-01 and 2014-07-05"; let after = Date::replaceall(before, "$m/$d/$y"); asserteq!(after, "03/14/2012, 01/01/2013 and 07/05/2014"); ```

Example: compile-time rejection of invalid regular expressions

```rust use birdmachine::birdmachine;

// this will not compile

[bird_machine(r"(oops i left this group open")]

struct Bad; ```