chumsky icon indicating copy to clipboard operation
chumsky copied to clipboard

Empty choice panics when trying to parse.

Open DaniD3v opened this issue 5 months ago • 4 comments

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.

DaniD3v avatar Sep 06 '24 05:09 DaniD3v