1use crate::{
4 ast::{
5 ty::{AtomicTy, ReferenceTy, Type},
7 },
8 lexer::token::TokenTy,
9};
10
11use super::{
12 Parser,
13 error::{ParserError, ParserErrorKind},
14};
15
16mod constrained_ty;
17mod primitive;
18mod reference;
19
20impl Type {
21 pub fn parse(parser: &mut Parser) -> Result<Self, ParserError> {
23 let atomic_ty_parse_fn = |parser: &mut Parser| AtomicTy::parse(parser).map(Type::Atomic);
29 let reference_ty_parse_fn =
30 |parser: &mut Parser| ReferenceTy::parse(parser).map(Type::Reference);
31
32 let order = [atomic_ty_parse_fn, reference_ty_parse_fn];
33
34 for parse_fn in order {
35 let initial_bytes_remaining = parser.bytes_remaining();
36
37 match (parse_fn)(parser) {
38 Ok(t) => return Ok(t),
40
41 Err(err) if parser.bytes_remaining() != initial_bytes_remaining => return Err(err),
43
44 Err(_) => continue,
46 }
47 }
48
49 Err(ParserErrorKind::ExpectedTypeSignature.at(parser.peek_fragment_or_rest_cloned()))
50 }
51}