linkrs_query/parser/parsing/ddl_parser/
describe_parser.rs1use 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}