From 5aba59b2918382ff34abf276c74113b97210f0f5 Mon Sep 17 00:00:00 2001 From: janis Date: Fri, 3 Oct 2025 19:37:42 +0200 Subject: [PATCH] custom integer with falliblity --- crates/parser/src/lib.rs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/crates/parser/src/lib.rs b/crates/parser/src/lib.rs index 8ff0f1c..9e5545d 100644 --- a/crates/parser/src/lib.rs +++ b/crates/parser/src/lib.rs @@ -389,7 +389,7 @@ fn new_token_input<'a>(input: &'a str) -> TokenInput<'a> { fn type_parser<'a, E>() -> impl Parser<'a, TokenInput<'a>, Type, E> where - E: chumsky::extra::ParserExtra<'a, TokenInput<'a>> + 'a, + E: chumsky::extra::ParserExtra<'a, TokenInput<'a>, Error = EmptyErr> + 'a, { let primitives = select! { Token::Void => InnerType::Unit, @@ -408,16 +408,24 @@ where Token::I64 => InnerType::Int { signed: true, size: IntSize::Bits(64) }, Token::ISize => InnerType::Int { signed: true, size: IntSize::Pointer }, }; + let u16 = text::int(10) + .to_slice() + .from_str::() + .try_map(|u, _span| u.map_err(|_| EmptyErr::default())); - let custom_int_inner = choice((just::<_, _, extra::Default>('u'), just('i'))) - .then(text::int(10).to_slice().from_str::().unwrapped()) + let integral_type = choice((just::<_, _, extra::Default>('u'), just('i'))) + .then(u16) .map(|(sign, size)| InnerType::Int { signed: sign == 'i', size: IntSize::Bits(size), }); - let custom_int = - select! {Token::Ident(ident) => ident}.map(move |s| custom_int_inner.parse(s).unwrap()); + let custom_int = select! {Token::Ident(ident) => ident}.try_map(move |s, _span| { + integral_type + .parse(s) + .into_result() + .map_err(|_| EmptyErr::default()) + }); recursive(|ty| { let pointer = just(Token::Star)