1use alloc::vec::Vec;
2
3use crate::{
4    keywords::Keyword,
5    lexer::Token,
6    parser::{ParseError, Parser},
7    qualified_name::parse_qualified_name,
8    QualifiedName, Span, Spanned,
9};
10
11#[derive(Debug, Clone)]
12pub struct TableToTable<'a> {
13    pub table: QualifiedName<'a>,
14    pub to_span: Span,
16    pub new_table: QualifiedName<'a>,
17}
18
19impl<'a> Spanned for TableToTable<'a> {
20    fn span(&self) -> Span {
21        self.table
22            .join_span(&self.to_span)
23            .join_span(&self.new_table)
24    }
25}
26
27#[derive(Debug, Clone)]
48pub struct RenameTable<'a> {
49    pub rename_span: Span,
51    pub table_span: Option<Span>,
53    pub table_to_tables: Vec<TableToTable<'a>>,
54}
55
56impl<'a> Spanned for RenameTable<'a> {
57    fn span(&self) -> Span {
58        self.rename_span
59            .join_span(&self.table_span)
60            .join_span(&self.table_to_tables)
61    }
62}
63
64pub(crate) fn parse_rename_table<'a>(
65    parser: &mut Parser<'a, '_>,
66) -> Result<RenameTable<'a>, ParseError> {
67    let rename_span = parser.consume_keyword(Keyword::RENAME)?;
68    let table_span = parser.skip_keyword(Keyword::TABLE);
69    let mut table_to_tables = Vec::new();
70    loop {
71        let table = parse_qualified_name(parser)?;
72        let to_span = parser.consume_keyword(Keyword::TO)?;
73        let new_table = parse_qualified_name(parser)?;
74        table_to_tables.push(TableToTable {
75            table,
76            to_span,
77            new_table,
78        });
79        if parser.skip_token(Token::Comma).is_none() {
80            break;
81        }
82    }
83    Ok(RenameTable {
84        rename_span,
85        table_span,
86        table_to_tables,
87    })
88}