/home/noah/src/ruchy/src/frontend/parser/types.rs
Line | Count | Source |
1 | | //! Type-related parsing - minimal version with only used functions |
2 | | |
3 | | use super::{ParserState, *}; |
4 | | |
5 | 0 | pub fn parse_struct_literal( |
6 | 0 | state: &mut ParserState, |
7 | 0 | name: String, |
8 | 0 | start_span: Span, |
9 | 0 | ) -> Result<Expr> { |
10 | 0 | state.tokens.expect(&Token::LeftBrace)?; |
11 | | |
12 | 0 | let mut fields = Vec::new(); |
13 | 0 | while !matches!(state.tokens.peek(), Some((Token::RightBrace, _))) { |
14 | | // Parse field name |
15 | 0 | let field_name = if let Some((Token::Identifier(name), _)) = state.tokens.peek() { |
16 | 0 | let name = name.clone(); |
17 | 0 | state.tokens.advance(); |
18 | 0 | name |
19 | | } else { |
20 | 0 | bail!("Expected field name"); |
21 | | }; |
22 | | |
23 | | // Parse colon and value |
24 | 0 | state.tokens.expect(&Token::Colon)?; |
25 | 0 | let value = super::parse_expr_recursive(state)?; |
26 | | |
27 | 0 | fields.push((field_name, value)); |
28 | | |
29 | | // Handle comma or end of struct literal |
30 | 0 | if matches!(state.tokens.peek(), Some((Token::Comma, _))) { |
31 | 0 | state.tokens.advance(); |
32 | 0 | } else { |
33 | 0 | break; |
34 | | } |
35 | | } |
36 | | |
37 | 0 | state.tokens.expect(&Token::RightBrace)?; |
38 | | |
39 | 0 | Ok(Expr::new( |
40 | 0 | ExprKind::StructLiteral { name, fields }, |
41 | 0 | start_span, |
42 | 0 | )) |
43 | 0 | } |