The winnow library for #RustLang is the most fun I've had writing parsers in my entire life. It's taken a thing that I've always dreaded and turned it into a joy.
I love two things about it:
It uses &mut &[u8], &mut &str, &mut <token stream ref>, etc. That is simply so much nicer to use than consuming a &[u8] and returning a &[u8].
It isn't all-encompassing! it encourages you to interleave imperative and functional code, just like idiomatic Rust in general.