recap-derive

Crates.iorecap-derive
lib.rsrecap-derive
version0.1.2
sourcesrc
created_at2019-04-14 23:28:11.328539
updated_at2021-12-28 02:54:59.648687
descriptionDerives FromStr impl for types which are then deserialized using recap
homepagehttps://github.com/softprops/recap
repositoryhttps://github.com/softprops/recap
max_upload_size
id127993
size6,513
cargo (github:rustpq:cargo)

documentation

https://docs.rs/recap-derive

README

recap Main 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

Commit count: 51

cargo fmt