Skip to main content

linkrs_query/parser/parsing/ddl_parser/
describe_parser.rs

1use crate::parser::ast::stmt::*;
2use crate::parser::core::error::{ParseError, ParseErrorKind};
3use crate::parser::parsing::parse_context::ParseContext;
4use crate::parser::TokenKind;
5
6use super::DdlParser;
7
8impl DdlParser {
9    pub fn parse_desc_statement(&mut self, ctx: &mut ParseContext) -> Result<Stmt, ParseError> {
10        let start_span = ctx.current_span();
11        ctx.expect_token(TokenKind::Desc)?;
12
13        if ctx.check_token(TokenKind::User) {
14            return self.parse_describe_user_internal(ctx, start_span);
15        }
16
17        let target = if ctx.match_token(TokenKind::Space) {
18            DescTarget::Space(ctx.expect_dcl_name()?)
19        } else if ctx.match_token(TokenKind::Tag) {
20            let tag_name = ctx.expect_identifier()?;
21            let space_name = if ctx.match_token(TokenKind::In) {
22                Some(ctx.expect_identifier()?)
23            } else {
24                None
25            };
26            DescTarget::Tag {
27                space_name: space_name.unwrap_or_default(),
28                tag_name,
29            }
30        } else if ctx.match_token(TokenKind::Edge) {
31            let edge_name = ctx.expect_identifier()?;
32            let space_name = if ctx.match_token(TokenKind::In) {
33                Some(ctx.expect_identifier()?)
34            } else {
35                None
36            };
37            DescTarget::Edge {
38                space_name: space_name.unwrap_or_default(),
39                edge_name,
40            }
41        } else {
42            return Err(ParseError::new(
43                ParseErrorKind::UnexpectedToken,
44                "Expected SPACE, TAG, EDGE, or USER".to_string(),
45                ctx.current_position(),
46            ));
47        };
48
49        let span = ctx.span_since(start_span.start);
50
51        Ok(Stmt::Desc(DescStmt { span, target }))
52    }
53
54    fn parse_describe_user_internal(
55        &mut self,
56        ctx: &mut ParseContext,
57        start_span: crate::parser::ast::types::Span,
58    ) -> Result<Stmt, ParseError> {
59        ctx.expect_token(TokenKind::User)?;
60
61        let username = ctx.expect_dcl_name()?;
62
63        let span = ctx.span_since(start_span.start);
64
65        Ok(Stmt::DescribeUser(DescribeUserStmt { span, username }))
66    }
67}