glaredb_parser 25.6.3

SQL parser for GlareDB
Documentation
use glaredb_error::{DbError, Result};
use serde::{Deserialize, Serialize};

use super::AstParseable;
use crate::keywords::Keyword;
use crate::parser::Parser;

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum DiscardType {
    All,
    Plans,
    Temp,
    Metadata,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DiscardStatement {
    pub discard_type: DiscardType,
}

impl AstParseable for DiscardStatement {
    fn parse(parser: &mut Parser) -> Result<Self> {
        parser.expect_keyword(Keyword::DISCARD)?;

        let discard_type = match parser.next_keyword()? {
            Keyword::ALL => DiscardType::All,
            Keyword::PLANS => DiscardType::Plans,
            Keyword::TEMP | Keyword::TEMPORARY => DiscardType::Temp,
            Keyword::METADATA => DiscardType::Metadata,
            other => {
                return Err(DbError::new(format!(
                    "Got unexpected keyword for discard type: {other}"
                )));
            }
        };

        Ok(DiscardStatement { discard_type })
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::ast::testutil::parse_ast;

    #[test]
    fn drop_all() {
        let got = parse_ast::<DiscardStatement>("discard all").unwrap();
        let expected = DiscardStatement {
            discard_type: DiscardType::All,
        };
        assert_eq!(expected, got);
    }
}