Skip to content
deserialize typed structures from regex captures
Branch: master
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github
recap-derive typo in error message Apr 14, 2019
recap
.gitignore
.travis.yml
CHANGELOG.md keep a changelog [skip ci] Apr 14, 2019
Cargo.toml init Apr 14, 2019
LICENSE
README.md
rustfmt.toml init Apr 14, 2019

README.md

recap Build Status Coverage Status Software License crates.io Released API docs Master API docs

deserialize named capture groups into typesafe structs

Recap is provides what envy provides for environment variables, for named capture groups. Named regex capture groups are like any other regex capture group but have the extra property that they are associated with name. i.e (?P<name-of-capture-group>some-pattern)

🤔 who is this for

You may find this crate useful for cases where your application needs to extract information from string input provided by a third party that has a loosely structured format.

A common usecase for this is when you are dealing with log file data that was not stored in a particular structured format like JSON, but rather in a format that can be represented with a pattern.

You may also find this useful parsing other loosely formatted data patterns.

This crate would be less appropriate for cases where your input is provided in a more structured format, like JSON. I recommend using a crate like serde-json for those cases instead.

📦 install

Add the following to your Cargo.toml file.

[dependencies]
recap = "0.1"

🤸 usage

A typical recap usage looks like the following. Assuming your Rust program looks something like this...

💡 These examples use Serde's derive feature

use recap::Recap;
use serde::Deserialize;
use std::error::Error;

#[derive(Debug, Deserialize, Recap)]
#[recap(regex = r#"(?x)
    (?P<foo>\d+)
    \s+
    (?P<bar>true|false)
    \s+
    (?P<baz>\S+)
  "#)]
struct LogEntry {
    foo: usize,
    bar: bool,
    baz: String,
}

fn main() -> Result<(), Box<dyn Error>> {
    let logs = r#"1 true hello
  2 false world"#;

    for line in logs.lines() {
        let entry: LogEntry = line.parse()?;
        println!("{:#?}", entry);
    }

    Ok(())
}

👭 Consider this crate a cousin of envy, a crate for deserializing environment variables into typesafe structs.

Doug Tangren (softprops) 2019

You can’t perform that action at this time.