datex_core/ast/
integer.rs1use 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}