chumsky
chumsky copied to clipboard
Empty choice panics when trying to parse.
struct ParsableType;
fn parser() -> impl Parser<char, ParsableType, Error = ParserError> {
let parsers: [BoxedParser<'_, char, ParsableType, Simple<char>>; 0] = [];
choice(parsers)
}
#[test]
fn this_panics() {
let _ = parser().parse("");
}
---- parser::bin_ops::this_panics stdout ----
thread 'parser::bin_ops::this_panics' panicked at /home/notyou/.cargo/registry/src/index.crates.io-6f17d22bba15001f/chumsky-0.9.3/src/primitive.rs:945:30:
called `Option::unwrap()` on a `None` value
Having an empty choice is reasonable and useful.
Consider having a Vec<Option<impl Parser>>
and then using .into_iter().flatten()
.
If you don't agree there should at least be an error message telling the user what went wrong.
here's the full backtrace:
---- parser::bin_ops::this_panics stdout ----
thread 'parser::bin_ops::this_panics' panicked at /home/notyou/.cargo/registry/src/index.crates.io-6f17d22bba15001f/chumsky-0.9.3/src/primitive.rs:945:30:
called `Option::unwrap()` on a `None` value
stack backtrace:
0: rust_begin_unwind
at /rustc/bd53aa3bf7a24a70d763182303bd75e5fc51a9af/library/std/src/panicking.rs:665:5
1: core::panicking::panic_fmt
at /rustc/bd53aa3bf7a24a70d763182303bd75e5fc51a9af/library/core/src/panicking.rs:74:14
2: core::panicking::panic
at /rustc/bd53aa3bf7a24a70d763182303bd75e5fc51a9af/library/core/src/panicking.rs:148:5
3: core::option::unwrap_failed
at /rustc/bd53aa3bf7a24a70d763182303bd75e5fc51a9af/library/core/src/option.rs:2015:5
4: core::option::Option<T>::unwrap
at /rustc/bd53aa3bf7a24a70d763182303bd75e5fc51a9af/library/core/src/option.rs:965:21
5: <chumsky::primitive::Choice<[A; N],E> as chumsky::Parser<I,O>>::parse_inner
at /home/notyou/.cargo/registry/src/index.crates.io-6f17d22bba15001f/chumsky-0.9.3/src/primitive.rs:945:30
6: chumsky::parse_recovery_inner
at /home/notyou/.cargo/registry/src/index.crates.io-6f17d22bba15001f/chumsky-0.9.3/src/lib.rs:110:29
7: chumsky::Parser::parse_recovery
at /home/notyou/.cargo/registry/src/index.crates.io-6f17d22bba15001f/chumsky-0.9.3/src/lib.rs:201:9
8: chumsky::Parser::parse
at /home/notyou/.cargo/registry/src/index.crates.io-6f17d22bba15001f/chumsky-0.9.3/src/lib.rs:241:32
9: greybolt::parser::bin_ops::this_panics
at ./src/parser/bin_ops.rs:94:13
10: greybolt::parser::bin_ops::this_panics::{{closure}}
at ./src/parser/bin_ops.rs:93:17
11: core::ops::function::FnOnce::call_once
at /rustc/bd53aa3bf7a24a70d763182303bd75e5fc51a9af/library/core/src/ops/function.rs:250:5
12: core::ops::function::FnOnce::call_once
at /rustc/bd53aa3bf7a24a70d763182303bd75e5fc51a9af/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.