1use std::fmt;
2use thiserror::Error;
3
4#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)]
6pub enum BuiltinName {
7 Str,
9 Lang,
10 LangMatches,
11 Datatype,
12 Iri,
13 BNode,
14 Rand,
15 Abs,
16 Ceil,
17 Floor,
18 Round,
19 Concat,
20 SubStr,
21 StrLen,
22 Replace,
23 UCase,
24 LCase,
25 EncodeForUri,
26 Contains,
27 StrStarts,
28 StrEnds,
29 StrBefore,
30 StrAfter,
31 Year,
32 Month,
33 Day,
34 Hours,
35 Minutes,
36 Seconds,
37 Timezone,
38 Tz,
39 Uuid,
40 StrUuid,
41 Md5,
42 Sha1,
43 Sha256,
44 Sha384,
45 Sha512,
46 StrLang,
47 StrDt,
48 IsIri,
49 IsBlank,
50 IsLiteral,
51 IsNumeric,
52 Regex,
53 Bound,
54 Coalesce,
55 If,
56
57 Sum,
59 Min,
60 Max,
61 Avg,
62 GroupConcat,
63
64 SameTerm,
66 Equal,
67 GreaterThan,
68 GreaterOrEqual,
69 LessThan,
70 LessOrEqual,
71
72 Add,
74 Div,
75 Mul,
76 Sub,
77 UnaryMinus,
78 UnaryPlus,
79
80 CastString,
82 CastInteger,
83 AsInt,
84 CastFloat,
85 CastDouble,
86 CastDecimal,
87 CastDateTime,
88 CastBoolean,
89
90 WithSortableEncoding,
92 WithTypedValueEncoding,
93 WithPlainTermEncoding,
94
95 EffectiveBooleanValue,
97 NativeBooleanAsTerm,
98 NativeInt64AsTerm,
99 IsCompatible,
100}
101
102impl fmt::Display for BuiltinName {
103 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
104 let name = match self {
105 Self::Str => "STR",
106 Self::Lang => "LANG",
107 Self::LangMatches => "LANGMATCHES",
108 Self::Datatype => "DATATYPE",
109 Self::Iri => "IRI",
110 Self::BNode => "BNODE",
111 Self::Rand => "RAND",
112 Self::Abs => "ABS",
113 Self::Ceil => "CEIL",
114 Self::Floor => "FLOOR",
115 Self::Round => "ROUND",
116 Self::Concat => "CONCAT",
117 Self::SubStr => "SUBSTR",
118 Self::StrLen => "STRLEN",
119 Self::Replace => "REPLACE",
120 Self::UCase => "UCASE",
121 Self::LCase => "LCASE",
122 Self::EncodeForUri => "ENCODE_FOR_URI",
123 Self::Contains => "CONTAINS",
124 Self::StrStarts => "STRSTARTS",
125 Self::StrEnds => "STRENDS",
126 Self::StrBefore => "STRBEFORE",
127 Self::StrAfter => "STRAFTER",
128 Self::Year => "YEAR",
129 Self::Month => "MONTH",
130 Self::Day => "DAY",
131 Self::Hours => "HOURS",
132 Self::Minutes => "MINUTES",
133 Self::Seconds => "SECONDS",
134 Self::Timezone => "TIMEZONE",
135 Self::Tz => "TZ",
136 Self::Uuid => "UUID",
137 Self::StrUuid => "STRUUID",
138 Self::Md5 => "MD5",
139 Self::Sha1 => "SHA1",
140 Self::Sha256 => "SHA256",
141 Self::Sha384 => "SHA384",
142 Self::Sha512 => "SHA512",
143 Self::StrLang => "STRLANG",
144 Self::StrDt => "STRDT",
145 Self::IsIri => "isIRI",
146 Self::IsBlank => "isBLANK",
147 Self::IsLiteral => "isLITERAL",
148 Self::IsNumeric => "isNUMERIC",
149 Self::Regex => "REGEX",
150 Self::If => "IF",
151 Self::SameTerm => "SAMETERM",
152 Self::Equal => "EQ",
153 Self::GreaterThan => "GT",
154 Self::GreaterOrEqual => "GEQ",
155 Self::LessThan => "LT",
156 Self::LessOrEqual => "LEQ",
157 Self::Add => "ADD",
158 Self::Div => "DIV",
159 Self::Mul => "MUL",
160 Self::Sub => "SUB",
161 Self::CastString => "xsd:string",
162 Self::CastInteger => "xsd:integer",
163 Self::AsInt => "xsd:int",
164 Self::CastFloat => "xsd:float",
165 Self::CastDouble => "xsd:double",
166 Self::CastDecimal => "xsd:decimal",
167 Self::CastDateTime => "xsd:dataTime",
168 Self::CastBoolean => "xsd:boolean",
169 Self::EffectiveBooleanValue => "EBV",
170 Self::NativeBooleanAsTerm => "BOOLEAN_AS_TERM",
171 Self::NativeInt64AsTerm => "INT64_AS_TERM",
172 Self::Bound => "BOUND",
173 Self::IsCompatible => "IS_COMPATIBLE",
174 Self::Coalesce => "COALESCE",
175 Self::UnaryMinus => "MINUS",
176 Self::UnaryPlus => "PLUS",
177 Self::Sum => "SUM",
178 Self::Min => "MIN",
179 Self::Max => "MAX",
180 Self::Avg => "AVG",
181 Self::GroupConcat => "GROUP_CONCAT",
182 Self::WithSortableEncoding => "ENC_SORT",
183 Self::WithTypedValueEncoding => "ENC_TV",
184 Self::WithPlainTermEncoding => "ENC_PT",
185 };
186 f.write_str(name)
187 }
188}
189
190#[derive(Debug, Error)]
191#[error("Function name is not a built-in function")]
192pub struct NotABuiltInError;
193
194impl TryFrom<&str> for BuiltinName {
195 type Error = NotABuiltInError;
196
197 fn try_from(value: &str) -> Result<Self, Self::Error> {
198 Ok(match value {
199 "STR" => Self::Str,
200 "LANG" => Self::Lang,
201 "LANGMATCHES" => Self::LangMatches,
202 "DATATYPE" => Self::Datatype,
203 "IRI" => Self::Iri,
204 "BNODE" => Self::BNode,
205 "RAND" => Self::Rand,
206 "ABS" => Self::Abs,
207 "CEIL" => Self::Ceil,
208 "FLOOR" => Self::Floor,
209 "ROUND" => Self::Round,
210 "CONCAT" => Self::Concat,
211 "SUBSTR" => Self::SubStr,
212 "STRLEN" => Self::StrLen,
213 "REPLACE" => Self::Replace,
214 "UCASE" => Self::UCase,
215 "LCASE" => Self::LCase,
216 "ENCODE_FOR_URI" => Self::EncodeForUri,
217 "CONTAINS" => Self::Contains,
218 "STRSTARTS" => Self::StrStarts,
219 "STRENDS" => Self::StrEnds,
220 "STRBEFORE" => Self::StrBefore,
221 "STRAFTER" => Self::StrAfter,
222 "YEAR" => Self::Year,
223 "MONTH" => Self::Month,
224 "DAY" => Self::Day,
225 "HOURS" => Self::Hours,
226 "MINUTES" => Self::Minutes,
227 "SECONDS" => Self::Seconds,
228 "TIMEZONE" => Self::Timezone,
229 "TZ" => Self::Tz,
230 "UUID" => Self::Uuid,
231 "STRUUID" => Self::StrUuid,
232 "MD5" => Self::Md5,
233 "SHA1" => Self::Sha1,
234 "SHA256" => Self::Sha256,
235 "SHA384" => Self::Sha384,
236 "SHA512" => Self::Sha512,
237 "STRLANG" => Self::StrLang,
238 "STRDT" => Self::StrDt,
239 "isIRI" => Self::IsIri,
240 "isBLANK" => Self::IsBlank,
241 "isLITERAL" => Self::IsLiteral,
242 "isNUMERIC" => Self::IsNumeric,
243 "REGEX" => Self::Regex,
244 "IF" => Self::If,
245 "SAMETERM" => Self::SameTerm,
246 "EQ" => Self::Equal,
247 "GT" => Self::GreaterThan,
248 "GEQ" => Self::GreaterOrEqual,
249 "LT" => Self::LessThan,
250 "LEQ" => Self::LessOrEqual,
251 "ADD" => Self::Add,
252 "DIV" => Self::Div,
253 "MUL" => Self::Mul,
254 "SUB" => Self::Sub,
255 "xsd:string" => Self::CastString,
256 "xsd:integer" => Self::CastInteger,
257 "xsd:int" => Self::AsInt,
258 "xsd:float" => Self::CastFloat,
259 "xsd:double" => Self::CastDouble,
260 "xsd:decimal" => Self::CastDecimal,
261 "xsd:dataTime" => Self::CastDateTime,
262 "xsd:boolean" => Self::CastBoolean,
263 "EBV" => Self::EffectiveBooleanValue,
264 "BOOLEAN_AS_TERM" => Self::NativeBooleanAsTerm,
265 "INT64_AS_TERM" => Self::NativeInt64AsTerm,
266 "BOUND" => Self::Bound,
267 "IS_COMPATIBLE" => Self::IsCompatible,
268 "COALESCE" => Self::Coalesce,
269 "MINUS" => Self::UnaryMinus,
270 "PLUS" => Self::UnaryPlus,
271 "SUM" => Self::Sum,
272 "MIN" => Self::Min,
273 "MAX" => Self::Max,
274 "AVG" => Self::Avg,
275 "GROUP_CONCAT" => Self::GroupConcat,
276 "ENC_SORT" => Self::WithSortableEncoding,
277 "ENC_TV" => Self::WithTypedValueEncoding,
278 "ENV_PT" => Self::WithPlainTermEncoding,
279 _ => return Err(NotABuiltInError {}),
280 })
281 }
282}