#string-parser #parser #string #format-args

macro no-std prse-derive

A helper macro crate for the prse crate

9 releases (stable)

1.1.2 Mar 25, 2024
1.1.1 Dec 15, 2023
1.0.3 Aug 15, 2023
1.0.1 Mar 22, 2023
0.1.0 Dec 18, 2022

#5 in #format-args

Download history 18/week @ 2024-06-23 5/week @ 2024-06-30 34/week @ 2024-07-07 2/week @ 2024-07-14 25/week @ 2024-07-21 41/week @ 2024-07-28 1/week @ 2024-08-04 21/week @ 2024-08-11 1/week @ 2024-08-18 5/week @ 2024-08-25 9/week @ 2024-09-01 29/week @ 2024-09-08 12/week @ 2024-09-15 78/week @ 2024-09-22 45/week @ 2024-09-29 7/week @ 2024-10-06

144 downloads per month
Used in 2 crates (via prse)

MIT/Apache

53KB
1K SLoC

Prse

github crates.io docs.rs

Prse is a small string parsing library with an emphasis on speed and ease of use. (It's also no-std compatible!)

It provides the parse! macro which allows you to easily parse strings into any type using a format args like syntax.

Prse currently supports rustc 1.70 and above.

Examples

use prse::parse;

let input = "5 + -2 = 3";

let total: i32;
let (lhs, rhs): (i32, i32) = parse!(input, "{} + {} = {total}");

assert_eq!(lhs + rhs, total);

It also allows you to parse into multiple variables separated by a separator in a single go.

use prse::parse;

let input = "My farm contains some amount of booleans: true || false || true || false";
let many: Vec<bool>;

// the variable to store the answer in is many and the separator is equal to " || "
parse!(input, "My farm contains some amount of booleans: {many: || :}");

assert_eq!(many, vec![true, false, true, false]);

You can use the try_parse! macro if you don't want to panic when the parsing fails.

use prse::try_parse;
use std::path::PathBuf;

let input = "cd C:\\windows\\system32";
let path: Result<PathBuf, _ > = try_parse!(input, "cd {}");

assert_eq!(path.unwrap(), PathBuf::from("C:\\windows\\system32"));

Additionally you can use the Parse derive macro to help you parse custom types. For even more flexibility you can implement the Parse trait yourself for fully custom parsing such as hexadecimal number parsing.

use prse::{parse, Parse};

#[derive(Parse, PartialEq, Eq, Debug)]
#[prse = "({x}, {y})"]
struct Position {
    x: i32,
    y: i32,
}

let input = "(1, 3) + (-2, 9)";

let (lhs, rhs): (Position, Position) = parse!(input, "{} + {}");

assert_eq!(lhs, Position { x: 1, y: 3 });
assert_eq!(rhs, Position { x: -2, y: 9 });

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~0.7–1.1MB
~25K SLoC