2

我已将我的nom依赖项从 4.x 更新到 5.x 版本,发现该宏take_until_and_consume已被弃用。变更日志 说:

"这可以替换为take_until组合take"

但我不知道如何模仿take_until_and_consume他们。有没有人在版本更新时遇到过这样的问题,或者有人知道怎么做吗?

我的意思是这个已弃用的宏take_until_and_consume。还有这些新的:taketake_until

4

1 回答 1

3

我相信这是直截了当的,但这里是一个通用的实现:

fn take_until_and_consume<T, I, E>(tag: T) -> impl Fn(I) -> nom::IResult<I, I, E>
where
    E: nom::error::ParseError<I>,
    I: nom::InputTake
        + nom::FindSubstring<T>
        + nom::Slice<std::ops::RangeFrom<usize>>
        + nom::InputIter<Item = u8>
        + nom::InputLength,
    T: nom::InputLength + Clone,
{
    use nom::bytes::streaming::take;
    use nom::bytes::streaming::take_until;
    use nom::sequence::terminated;

    move |input| terminated(take_until(tag.clone()), take(tag.input_len()))(input)
}

#[test]
fn test_take_until_and_consume() {
    let r = take_until_and_consume::<_, _, ()>("foo")(&b"abcd foo efgh"[..]);
    assert_eq!(r, Ok((&b" efgh"[..], &b"abcd "[..])));
}
于 2020-05-13T11:22:29.240 回答