datex_core/ast/
integer.rs

1use crate::ast::DatexExpression;
2use crate::ast::DatexParserTrait;
3use crate::ast::ParserRecoverExt;
4use crate::ast::lexer::{IntegerLiteral, Token};
5use crate::values::core_values::integer::Integer;
6use crate::values::core_values::integer::typed_integer::TypedInteger;
7use chumsky::prelude::*;
8
9pub fn integer<'a>() -> impl DatexParserTrait<'a> {
10    select! {
11        Token::DecimalIntegerLiteral(IntegerLiteral { value, variant }) => {
12            match variant {
13                Some(var) => TypedInteger::from_string_with_variant(&value, var)
14                    .map(DatexExpression::TypedInteger),
15                None => Integer::from_string(&value)
16                    .map(DatexExpression::Integer),
17            }
18        },
19        Token::BinaryIntegerLiteral(IntegerLiteral { value, variant }) => {
20            match variant {
21                Some(var) => TypedInteger::from_string_radix_with_variant(&value[2..], 2, var)
22                    .map(DatexExpression::TypedInteger),
23                None => Integer::from_string_radix(&value[2..], 2)
24                    .map(DatexExpression::Integer),
25            }
26        },
27        Token::HexadecimalIntegerLiteral(IntegerLiteral { value, variant }) => {
28            match variant {
29                Some(var) => TypedInteger::from_string_radix_with_variant(&value[2..], 16, var)
30                    .map(DatexExpression::TypedInteger),
31                None => Integer::from_string_radix(&value[2..], 16)
32                    .map(DatexExpression::Integer),
33            }
34        },
35        Token::OctalIntegerLiteral(IntegerLiteral { value, variant }) => {
36            match variant {
37                Some(var) => TypedInteger::from_string_radix_with_variant(&value[2..], 8, var)
38                    .map(DatexExpression::TypedInteger),
39                None => Integer::from_string_radix(&value[2..], 8)
40                    .map(DatexExpression::Integer),
41            }
42        },
43    }.recover_invalid()
44}