#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Token {
Ident(String),
Keyword(Keyword),
IntLit(String),
FloatLit(String),
StringLit(String),
LParen,
RParen,
Comma,
Semicolon,
Star,
Plus,
Minus,
Slash,
Concat,
TypeCast,
Dot,
Eq,
Ne,
Lt,
Le,
Gt,
Ge,
Param(u32),
Eof,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Keyword {
Create,
Unique,
Index,
Global,
Local,
Table,
View,
Drop,
Insert,
Copy,
Into,
Values,
Select,
With,
Recursive,
From,
Where,
Order,
By,
Asc,
Desc,
Limit,
And,
Or,
Not,
True,
False,
Null,
As,
Begin,
Start,
Transaction,
Commit,
End,
Rollback,
Abort,
Update,
Set,
Delete,
Isolation,
Level,
Read,
Committed,
Repeatable,
For,
Share,
Group,
Having,
Distinct,
All,
Is,
In,
Between,
Like,
Ilike,
Case,
When,
Then,
Else,
Offset,
Cast,
Join,
Inner,
Left,
Right,
Full,
Outer,
Cross,
On,
Using,
Natural,
Exists,
Any,
Some,
Union,
Intersect,
Except,
Foreign,
Data,
Wrapper,
Server,
Mapping,
User,
Options,
Import,
Schema,
To,
If,
CurrentUser,
Public,
Returning,
}
impl Keyword {
#[must_use]
pub fn from_word(w: &str) -> Option<Keyword> {
Some(match w {
"create" => Keyword::Create,
"unique" => Keyword::Unique,
"index" => Keyword::Index,
"global" => Keyword::Global,
"local" => Keyword::Local,
"table" => Keyword::Table,
"view" => Keyword::View,
"drop" => Keyword::Drop,
"insert" => Keyword::Insert,
"copy" => Keyword::Copy,
"into" => Keyword::Into,
"values" => Keyword::Values,
"select" => Keyword::Select,
"with" => Keyword::With,
"recursive" => Keyword::Recursive,
"from" => Keyword::From,
"where" => Keyword::Where,
"order" => Keyword::Order,
"by" => Keyword::By,
"asc" => Keyword::Asc,
"desc" => Keyword::Desc,
"limit" => Keyword::Limit,
"and" => Keyword::And,
"or" => Keyword::Or,
"not" => Keyword::Not,
"true" => Keyword::True,
"false" => Keyword::False,
"null" => Keyword::Null,
"as" => Keyword::As,
"begin" => Keyword::Begin,
"start" => Keyword::Start,
"transaction" => Keyword::Transaction,
"commit" => Keyword::Commit,
"end" => Keyword::End,
"rollback" => Keyword::Rollback,
"abort" => Keyword::Abort,
"update" => Keyword::Update,
"set" => Keyword::Set,
"delete" => Keyword::Delete,
"isolation" => Keyword::Isolation,
"level" => Keyword::Level,
"read" => Keyword::Read,
"committed" => Keyword::Committed,
"repeatable" => Keyword::Repeatable,
"for" => Keyword::For,
"share" => Keyword::Share,
"group" => Keyword::Group,
"having" => Keyword::Having,
"distinct" => Keyword::Distinct,
"all" => Keyword::All,
"is" => Keyword::Is,
"in" => Keyword::In,
"between" => Keyword::Between,
"like" => Keyword::Like,
"ilike" => Keyword::Ilike,
"case" => Keyword::Case,
"when" => Keyword::When,
"then" => Keyword::Then,
"else" => Keyword::Else,
"offset" => Keyword::Offset,
"cast" => Keyword::Cast,
"join" => Keyword::Join,
"inner" => Keyword::Inner,
"left" => Keyword::Left,
"right" => Keyword::Right,
"full" => Keyword::Full,
"outer" => Keyword::Outer,
"cross" => Keyword::Cross,
"on" => Keyword::On,
"using" => Keyword::Using,
"natural" => Keyword::Natural,
"exists" => Keyword::Exists,
"any" => Keyword::Any,
"some" => Keyword::Some,
"union" => Keyword::Union,
"intersect" => Keyword::Intersect,
"except" => Keyword::Except,
"foreign" => Keyword::Foreign,
"data" => Keyword::Data,
"wrapper" => Keyword::Wrapper,
"server" => Keyword::Server,
"mapping" => Keyword::Mapping,
"user" => Keyword::User,
"options" => Keyword::Options,
"import" => Keyword::Import,
"schema" => Keyword::Schema,
"to" => Keyword::To,
"if" => Keyword::If,
"current_user" => Keyword::CurrentUser,
"public" => Keyword::Public,
"returning" => Keyword::Returning,
_ => return None,
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_word_round_trips_every_keyword() {
let pairs: &[(&str, Keyword)] = &[
("create", Keyword::Create),
("unique", Keyword::Unique),
("index", Keyword::Index),
("global", Keyword::Global),
("local", Keyword::Local),
("table", Keyword::Table),
("view", Keyword::View),
("drop", Keyword::Drop),
("insert", Keyword::Insert),
("copy", Keyword::Copy),
("into", Keyword::Into),
("values", Keyword::Values),
("select", Keyword::Select),
("with", Keyword::With),
("recursive", Keyword::Recursive),
("from", Keyword::From),
("where", Keyword::Where),
("order", Keyword::Order),
("by", Keyword::By),
("asc", Keyword::Asc),
("desc", Keyword::Desc),
("limit", Keyword::Limit),
("and", Keyword::And),
("or", Keyword::Or),
("not", Keyword::Not),
("true", Keyword::True),
("false", Keyword::False),
("null", Keyword::Null),
("as", Keyword::As),
("begin", Keyword::Begin),
("start", Keyword::Start),
("transaction", Keyword::Transaction),
("commit", Keyword::Commit),
("end", Keyword::End),
("rollback", Keyword::Rollback),
("abort", Keyword::Abort),
("update", Keyword::Update),
("set", Keyword::Set),
("delete", Keyword::Delete),
("isolation", Keyword::Isolation),
("level", Keyword::Level),
("read", Keyword::Read),
("committed", Keyword::Committed),
("repeatable", Keyword::Repeatable),
("for", Keyword::For),
("share", Keyword::Share),
("group", Keyword::Group),
("having", Keyword::Having),
("distinct", Keyword::Distinct),
("all", Keyword::All),
("cast", Keyword::Cast),
("join", Keyword::Join),
("inner", Keyword::Inner),
("left", Keyword::Left),
("right", Keyword::Right),
("full", Keyword::Full),
("outer", Keyword::Outer),
("cross", Keyword::Cross),
("on", Keyword::On),
("using", Keyword::Using),
("natural", Keyword::Natural),
("exists", Keyword::Exists),
("any", Keyword::Any),
("some", Keyword::Some),
("union", Keyword::Union),
("intersect", Keyword::Intersect),
("except", Keyword::Except),
("foreign", Keyword::Foreign),
("data", Keyword::Data),
("wrapper", Keyword::Wrapper),
("server", Keyword::Server),
("mapping", Keyword::Mapping),
("user", Keyword::User),
("options", Keyword::Options),
("import", Keyword::Import),
("schema", Keyword::Schema),
("to", Keyword::To),
("if", Keyword::If),
("current_user", Keyword::CurrentUser),
("public", Keyword::Public),
("returning", Keyword::Returning),
];
for (word, kw) in pairs {
assert_eq!(Keyword::from_word(word), Some(*kw), "from_word({word:?})");
}
assert_eq!(Keyword::from_word("widget"), None);
assert_eq!(Keyword::from_word("ascending"), None);
}
}