rust-bakery / nom

Rust parser combinator framework
MIT License
9.18k stars 792 forks source link

Add support for character::*::{isize,usize} parsers #1762

Open AMDmi3 opened 1 month ago

AMDmi3 commented 1 month ago

Trivial change to add character::{streaming,complete}::{usize,isize} parsers. The use case is to parse item quantities which are later used in nom::multi::count, or to parse values which are intended to index collections without residing to needless casts.

Example use case:

use nom::character::complete::{newline, usize};
use nom::IResult;

fn parse(input: &str) -> IResult<&str, Vec<usize>> {
    let (input, count) = nom::sequence::terminated(usize, newline)(input)?;
    nom::multi::count(
        nom::sequence::terminated(usize, newline), 
        count
    )(input)
}

fn main() {
    assert_eq!(parse("3\n1\n2\n3\n"), Ok(("", vec![1, 2, 3])));
}

Without this change I have to complicate the code with casts:

use nom::character::complete::{newline, u32};
use nom::IResult;

fn parse(input: &str) -> IResult<&str, Vec<usize>> {
    let (input, count) = nom::sequence::terminated(u32, newline)(input)?;
    nom::multi::count(
        nom::sequence::terminated(
            nom::combinator::map(u32, |v| v as usize), 
            newline
        ),
        count as usize,
    )(input)
}

fn main() {
    assert_eq!(parse("3\n1\n2\n3\n"), Ok(("", vec![1, 2, 3])));
}

This change applies to both main and 7.x branches, if accepted please merge to both. Test pass for both branches as well.