use alloc::vec::Vec;
use crate::{
keywords::Keyword,
lexer::Token,
parser::{ParseError, Parser},
qualified_name::parse_qualified_name,
QualifiedName, Span, Spanned,
};
#[derive(Debug, Clone)]
pub struct TableToTable<'a> {
pub table: QualifiedName<'a>,
pub to_span: Span,
pub new_table: QualifiedName<'a>,
}
impl<'a> Spanned for TableToTable<'a> {
fn span(&self) -> Span {
self.table
.join_span(&self.to_span)
.join_span(&self.new_table)
}
}
#[derive(Debug, Clone)]
pub struct RenameTable<'a> {
pub rename_span: Span,
pub table_span: Option<Span>,
pub table_to_tables: Vec<TableToTable<'a>>,
}
impl<'a> Spanned for RenameTable<'a> {
fn span(&self) -> Span {
self.rename_span
.join_span(&self.table_span)
.join_span(&self.table_to_tables)
}
}
pub(crate) fn parse_rename_table<'a>(
parser: &mut Parser<'a, '_>,
) -> Result<RenameTable<'a>, ParseError> {
let rename_span = parser.consume_keyword(Keyword::RENAME)?;
let table_span = parser.skip_keyword(Keyword::TABLE);
let mut table_to_tables = Vec::new();
loop {
let table = parse_qualified_name(parser)?;
let to_span = parser.consume_keyword(Keyword::TO)?;
let new_table = parse_qualified_name(parser)?;
table_to_tables.push(TableToTable {
table,
to_span,
new_table,
});
if parser.skip_token(Token::Comma).is_none() {
break;
}
}
Ok(RenameTable {
rename_span,
table_span,
table_to_tables,
})
}