parse-display-with 0.0.2

Custom formatting/parsing utilities for parse-display.
Documentation
#![cfg(feature = "std")]

use core::fmt::{Debug, Display};
use core::str::FromStr;

use parse_display::FromStr;
use parse_display_with::formats::delimiter;

#[test]
fn delimiter_struct() {
    #[derive(FromStr, Debug, Eq, PartialEq)]
    #[display("{0}")]
    struct X(#[display(with = delimiter(", "))] Vec<u32>);

    assert_from_str("10, 20, 30", X(vec![10, 20, 30]));
}

#[test]
fn delimiter_enum() {
    #[derive(FromStr, Debug, Eq, PartialEq)]

    enum X {
        #[display("a : {0}")]
        A(#[display(with = delimiter(", "))] Vec<u32>),

        #[display("b : {0}")]
        B(#[display(with = delimiter(", "))] Vec<u32>),
    }

    assert_from_str("a : 10, 20, 30", X::A(vec![10, 20, 30]));
    assert_from_str("b : 10, 20, 30", X::B(vec![10, 20, 30]));
}

#[test]
fn with_and_default_bound() {
    #[derive(FromStr, Debug, Eq, PartialEq)]
    struct X<T: FromStr>(#[from_str(with = delimiter(", "))] Vec<T>);

    assert_from_str("10, 20, 30", X(vec![10, 20, 30]));
}

fn assert_from_str<T: FromStr + Debug + PartialEq>(s: &str, value: T)
where
    <T as FromStr>::Err: Display,
{
    match s.parse::<T>() {
        Ok(a) => assert_eq!(a, value, "input = \"{s}\""),
        Err(e) => panic!("\"{s}\" parse failed. ({e})"),
    }
}