1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
pub const KEYWORDS: &[&str] = &[
    "abs",
    "abstract",
    "acos",
    "aggregate",
    "alias",
    "and",
    "andor",
    "array",
    "as",
    "asin",
    "atan",
    "bag",
    "based",
    "based_on",
    "begin",
    "binary",
    "blength",
    "boolean",
    "by",
    "case",
    "const_e",
    "constant",
    "constraint",
    "cos",
    "derive",
    "div",
    "else",
    "end",
    "end_alias",
    "end_case",
    "end_constant",
    "end_entity",
    "end_function",
    "end_if",
    "end_local",
    "end_procedure",
    "end_repeat",
    "end_rule",
    "end_schema",
    "end_subtype_constraint",
    "end_type",
    "entity",
    "enumeration",
    "escape",
    "exists",
    "exp",
    "extensible",
    "false",
    "fixed",
    "for",
    "format",
    "from",
    "function",
    "generic",
    "generic_entity",
    "hibound",
    "hiindex",
    "if",
    "in",
    "insert",
    "integer",
    "inverse",
    "length",
    "like",
    "list",
    "lobound",
    "local",
    "log",
    "log10",
    "log2",
    "logical",
    "loindex",
    "mod",
    "not",
    "number",
    "nvl",
    "odd",
    "of",
    "on",
    "oneof",
    "optional",
    "or",
    "otherwise",
    "pi",
    "procedure",
    "query",
    "real",
    "reference",
    "remove",
    "renamed",
    "repeat",
    "return",
    "rolesof",
    "rule",
    "schema",
    "select",
    "self",
    "set",
    "sin",
    "sizeof",
    "skip",
    "sqrt",
    "string",
    "subtype",
    "subtype_constraint",
    "supertype",
    "tan",
    "then",
    "to",
    "total_over",
    "true",
    "type",
    "typeof",
    "unique",
    "unknown",
    "until",
    "use",
    "usedin",
    "value",
    "value_in",
    "value_unique",
    "var",
    "where",
    "while",
    "with",
    "xor",
];

pub fn is_reserved(input: &str) -> bool {
    KEYWORDS
        .iter()
        .any(|&keyword| keyword == input.to_lowercase())
}

#[cfg(test)]
mod tests {
    #[test]
    fn is_reserved() {
        assert!(super::is_reserved("end"));
        assert!(!super::is_reserved(""));
        assert!(super::is_reserved("end_entity"));
        assert!(super::is_reserved("END_ENTITY"));
        assert!(!super::is_reserved("end_homhom"));
    }
}