Skip to main content

surql_parser/
doc_urls.rs

1//! Auto-generated documentation URL mapping for SurrealQL.
2//! Generated from docs.surrealdb.com content on 2026-03-23.
3//!
4//! Re-generate by running the doc_urls extraction task against
5//! the docs repo at `docs.surrealdb.com/src/content/doc-surrealql/`.
6
7/// Base URL for SurrealQL documentation. Intentionally NOT used in match arms below:
8/// each URL is spelled out in full for grep-ability (searching for a specific URL
9/// should find the exact match arm).
10#[allow(dead_code)]
11const BASE: &str = "https://surrealdb.com/docs/surrealql";
12
13/// Get the documentation URL for a SurrealQL keyword, statement, function, or clause.
14///
15/// Accepts keywords in any case. Compound keywords can be space-separated
16/// (e.g., `"define table"`, `"order by"`, `"live select"`).
17///
18/// For function namespaces, pass the namespace with a trailing `::` or without
19/// (e.g., `"string"` or `"string::"`). For specific function lookups, use
20/// [`doc_url_for_function`] instead.
21pub fn doc_url(keyword: &str) -> Option<&'static str> {
22	let lower = keyword.to_lowercase();
23	let trimmed = lower.trim();
24	match trimmed {
25		// ── Statements ──────────────────────────────────────────────
26		"access" => Some("https://surrealdb.com/docs/surrealql/statements/access"),
27		"begin" | "begin transaction" => {
28			Some("https://surrealdb.com/docs/surrealql/statements/begin")
29		}
30		"break" => Some("https://surrealdb.com/docs/surrealql/statements/break"),
31		"cancel" | "cancel transaction" => {
32			Some("https://surrealdb.com/docs/surrealql/statements/cancel")
33		}
34		"commit" | "commit transaction" => {
35			Some("https://surrealdb.com/docs/surrealql/statements/commit")
36		}
37		"continue" => Some("https://surrealdb.com/docs/surrealql/statements/continue"),
38		"create" => Some("https://surrealdb.com/docs/surrealql/statements/create"),
39		"delete" => Some("https://surrealdb.com/docs/surrealql/statements/delete"),
40		"explain" => Some("https://surrealdb.com/docs/surrealql/statements/explain"),
41		"for" => Some("https://surrealdb.com/docs/surrealql/statements/for"),
42		"if" | "if else" | "else" => Some("https://surrealdb.com/docs/surrealql/statements/ifelse"),
43		"info" => Some("https://surrealdb.com/docs/surrealql/statements/info"),
44		"insert" => Some("https://surrealdb.com/docs/surrealql/statements/insert"),
45		"kill" => Some("https://surrealdb.com/docs/surrealql/statements/kill"),
46		"let" => Some("https://surrealdb.com/docs/surrealql/statements/let"),
47		"live" | "live select" => Some("https://surrealdb.com/docs/surrealql/statements/live"),
48		"rebuild" => Some("https://surrealdb.com/docs/surrealql/statements/rebuild"),
49		"relate" => Some("https://surrealdb.com/docs/surrealql/statements/relate"),
50		"remove" => Some("https://surrealdb.com/docs/surrealql/statements/remove"),
51		"return" => Some("https://surrealdb.com/docs/surrealql/statements/return"),
52		"select" => Some("https://surrealdb.com/docs/surrealql/statements/select"),
53		"show" | "show changes" => Some("https://surrealdb.com/docs/surrealql/statements/show"),
54		"sleep" => Some("https://surrealdb.com/docs/surrealql/statements/sleep"),
55		"throw" => Some("https://surrealdb.com/docs/surrealql/statements/throw"),
56		"update" => Some("https://surrealdb.com/docs/surrealql/statements/update"),
57		"upsert" => Some("https://surrealdb.com/docs/surrealql/statements/upsert"),
58		"use" => Some("https://surrealdb.com/docs/surrealql/statements/use"),
59
60		// ── DEFINE variants ─────────────────────────────────────────
61		"define" => Some("https://surrealdb.com/docs/surrealql/statements/define"),
62		"define access" => Some("https://surrealdb.com/docs/surrealql/statements/define/access"),
63		"define access bearer" => {
64			Some("https://surrealdb.com/docs/surrealql/statements/define/access/bearer")
65		}
66		"define access jwt" => {
67			Some("https://surrealdb.com/docs/surrealql/statements/define/access/jwt")
68		}
69		"define access record" => {
70			Some("https://surrealdb.com/docs/surrealql/statements/define/access/record")
71		}
72		"define analyzer" | "analyzer" => {
73			Some("https://surrealdb.com/docs/surrealql/statements/define/analyzer")
74		}
75		"define api" => Some("https://surrealdb.com/docs/surrealql/statements/define/api"),
76		"define bucket" | "bucket" => {
77			Some("https://surrealdb.com/docs/surrealql/statements/define/bucket")
78		}
79		"define config" | "config" => {
80			Some("https://surrealdb.com/docs/surrealql/statements/define/config")
81		}
82		"define database" | "define db" | "database" => {
83			Some("https://surrealdb.com/docs/surrealql/statements/define/database")
84		}
85		"define event" | "event" => {
86			Some("https://surrealdb.com/docs/surrealql/statements/define/event")
87		}
88		"define field" | "field" => {
89			Some("https://surrealdb.com/docs/surrealql/statements/define/field")
90		}
91		"define function" | "function" => {
92			Some("https://surrealdb.com/docs/surrealql/statements/define/function")
93		}
94		"define index" | "index" => {
95			Some("https://surrealdb.com/docs/surrealql/statements/define/indexes")
96		}
97		"define module" | "module" => {
98			Some("https://surrealdb.com/docs/surrealql/statements/define/module")
99		}
100		"define namespace" | "define ns" | "namespace" => {
101			Some("https://surrealdb.com/docs/surrealql/statements/define/namespace")
102		}
103		"define param" => Some("https://surrealdb.com/docs/surrealql/statements/define/param"),
104		"define sequence" | "sequence" => {
105			Some("https://surrealdb.com/docs/surrealql/statements/define/sequence")
106		}
107		"define table" | "table" => {
108			Some("https://surrealdb.com/docs/surrealql/statements/define/table")
109		}
110		"define user" | "user" => {
111			Some("https://surrealdb.com/docs/surrealql/statements/define/user")
112		}
113
114		// ── ALTER variants ──────────────────────────────────────────
115		"alter" => Some("https://surrealdb.com/docs/surrealql/statements/alter"),
116		"alter database" | "alter db" => {
117			Some("https://surrealdb.com/docs/surrealql/statements/alter/database")
118		}
119		"alter field" => Some("https://surrealdb.com/docs/surrealql/statements/alter/field"),
120		"alter index" => Some("https://surrealdb.com/docs/surrealql/statements/alter/indexes"),
121		"alter namespace" | "alter ns" => {
122			Some("https://surrealdb.com/docs/surrealql/statements/alter/namespace")
123		}
124		"alter sequence" => Some("https://surrealdb.com/docs/surrealql/statements/alter/sequence"),
125		"alter system" => Some("https://surrealdb.com/docs/surrealql/statements/alter/system"),
126		"alter table" => Some("https://surrealdb.com/docs/surrealql/statements/alter/table"),
127
128		// ── Clauses ─────────────────────────────────────────────────
129		"explain clause" => Some("https://surrealdb.com/docs/surrealql/clauses/explain"),
130		"fetch" => Some("https://surrealdb.com/docs/surrealql/clauses/fetch"),
131		"from" => Some("https://surrealdb.com/docs/surrealql/clauses/from"),
132		"group by" | "group" => Some("https://surrealdb.com/docs/surrealql/clauses/group-by"),
133		"limit" => Some("https://surrealdb.com/docs/surrealql/clauses/limit"),
134		"omit" => Some("https://surrealdb.com/docs/surrealql/clauses/omit"),
135		"order by" | "order" => Some("https://surrealdb.com/docs/surrealql/clauses/order-by"),
136		"split" => Some("https://surrealdb.com/docs/surrealql/clauses/split"),
137		"where" => Some("https://surrealdb.com/docs/surrealql/clauses/where"),
138		"with" => Some("https://surrealdb.com/docs/surrealql/clauses/with"),
139
140		// ── Data types / datamodel ──────────────────────────────────
141		"array" | "arrays" => Some("https://surrealdb.com/docs/surrealql/datamodel/arrays"),
142		"bool" | "boolean" | "booleans" => {
143			Some("https://surrealdb.com/docs/surrealql/datamodel/booleans")
144		}
145		"bytes" => Some("https://surrealdb.com/docs/surrealql/datamodel/bytes"),
146		"casting" | "cast" => Some("https://surrealdb.com/docs/surrealql/datamodel/casting"),
147		"closure" | "closures" => Some("https://surrealdb.com/docs/surrealql/datamodel/closures"),
148		"datetime" | "datetimes" => {
149			Some("https://surrealdb.com/docs/surrealql/datamodel/datetimes")
150		}
151		"duration" | "durations" => {
152			Some("https://surrealdb.com/docs/surrealql/datamodel/durations")
153		}
154		"file" | "files" => Some("https://surrealdb.com/docs/surrealql/datamodel/files"),
155		"formatters" | "formatter" => {
156			Some("https://surrealdb.com/docs/surrealql/datamodel/formatters")
157		}
158		"future" | "futures" => Some("https://surrealdb.com/docs/surrealql/datamodel/futures"),
159		"geometry" | "geometries" => {
160			Some("https://surrealdb.com/docs/surrealql/datamodel/geometries")
161		}
162		"idiom" | "idioms" => Some("https://surrealdb.com/docs/surrealql/datamodel/idioms"),
163		"record id" | "record ids" | "ids" => {
164			Some("https://surrealdb.com/docs/surrealql/datamodel/ids")
165		}
166		"literal" | "literals" => Some("https://surrealdb.com/docs/surrealql/datamodel/literals"),
167		"none" | "null" | "none and null" => {
168			Some("https://surrealdb.com/docs/surrealql/datamodel/none-and-null")
169		}
170		"number" | "numbers" | "int" | "float" | "decimal" => {
171			Some("https://surrealdb.com/docs/surrealql/datamodel/numbers")
172		}
173		"object" | "objects" => Some("https://surrealdb.com/docs/surrealql/datamodel/objects"),
174		"range" | "ranges" => Some("https://surrealdb.com/docs/surrealql/datamodel/ranges"),
175		"record" | "records" | "record link" | "record links" => {
176			Some("https://surrealdb.com/docs/surrealql/datamodel/records")
177		}
178		"reference" | "references" | "record reference" | "record references" => {
179			Some("https://surrealdb.com/docs/surrealql/datamodel/references")
180		}
181		"regex" => Some("https://surrealdb.com/docs/surrealql/datamodel/regex"),
182		"set" | "sets" => Some("https://surrealdb.com/docs/surrealql/datamodel/sets"),
183		"string" | "strings" => Some("https://surrealdb.com/docs/surrealql/datamodel/strings"),
184		"uuid" | "uuids" => Some("https://surrealdb.com/docs/surrealql/datamodel/uuid"),
185		"value" | "values" => Some("https://surrealdb.com/docs/surrealql/datamodel/values"),
186		"data types" | "datamodel" => Some("https://surrealdb.com/docs/surrealql/datamodel"),
187
188		// ── Function namespaces ─────────────────────────────────────
189		"api::" | "api functions" => {
190			Some("https://surrealdb.com/docs/surrealql/functions/database/api")
191		}
192		"array::" | "array functions" => {
193			Some("https://surrealdb.com/docs/surrealql/functions/database/array")
194		}
195		"bytes::" | "bytes functions" => {
196			Some("https://surrealdb.com/docs/surrealql/functions/database/bytes")
197		}
198		"count" | "count()" => {
199			Some("https://surrealdb.com/docs/surrealql/functions/database/count")
200		}
201		"crypto::" | "crypto functions" => {
202			Some("https://surrealdb.com/docs/surrealql/functions/database/crypto")
203		}
204		"duration::" | "duration functions" => {
205			Some("https://surrealdb.com/docs/surrealql/functions/database/duration")
206		}
207		"encoding::" | "encoding functions" => {
208			Some("https://surrealdb.com/docs/surrealql/functions/database/encoding")
209		}
210		"file::" | "file functions" => {
211			Some("https://surrealdb.com/docs/surrealql/functions/database/file")
212		}
213		"geo::" | "geo functions" => {
214			Some("https://surrealdb.com/docs/surrealql/functions/database/geo")
215		}
216		"http::" | "http functions" => {
217			Some("https://surrealdb.com/docs/surrealql/functions/database/http")
218		}
219		"math::" | "math functions" => {
220			Some("https://surrealdb.com/docs/surrealql/functions/database/math")
221		}
222		"meta::" | "meta functions" => {
223			Some("https://surrealdb.com/docs/surrealql/functions/database/meta")
224		}
225		"not()" | "not function" => {
226			Some("https://surrealdb.com/docs/surrealql/functions/database/not")
227		}
228		"object::" | "object functions" => {
229			Some("https://surrealdb.com/docs/surrealql/functions/database/object")
230		}
231		"parse::" | "parse functions" => {
232			Some("https://surrealdb.com/docs/surrealql/functions/database/parse")
233		}
234		"rand::" | "rand functions" | "rand" | "rand()" => {
235			Some("https://surrealdb.com/docs/surrealql/functions/database/rand")
236		}
237		"record::" | "record functions" => {
238			Some("https://surrealdb.com/docs/surrealql/functions/database/record")
239		}
240		"search::" | "search functions" => {
241			Some("https://surrealdb.com/docs/surrealql/functions/database/search")
242		}
243		"sequence::" | "sequence functions" => {
244			Some("https://surrealdb.com/docs/surrealql/functions/database/sequence")
245		}
246		"session::" | "session functions" => {
247			Some("https://surrealdb.com/docs/surrealql/functions/database/session")
248		}
249		"set::" | "set functions" => {
250			Some("https://surrealdb.com/docs/surrealql/functions/database/set")
251		}
252		"sleep()" | "sleep function" => {
253			Some("https://surrealdb.com/docs/surrealql/functions/database/sleep")
254		}
255		"string::" | "string functions" => {
256			Some("https://surrealdb.com/docs/surrealql/functions/database/string")
257		}
258		"time::" | "time functions" => {
259			Some("https://surrealdb.com/docs/surrealql/functions/database/time")
260		}
261		"type::" | "type functions" => {
262			Some("https://surrealdb.com/docs/surrealql/functions/database/type")
263		}
264		"value::" | "value functions" => {
265			Some("https://surrealdb.com/docs/surrealql/functions/database/value")
266		}
267		"vector::" | "vector functions" => {
268			Some("https://surrealdb.com/docs/surrealql/functions/database/vector")
269		}
270		"functions" => Some("https://surrealdb.com/docs/surrealql/functions"),
271
272		// ── ML functions ────────────────────────────────────────────
273		"ml" | "ml::" | "machine learning" => {
274			Some("https://surrealdb.com/docs/surrealql/functions/ml")
275		}
276		"ml functions" => Some("https://surrealdb.com/docs/surrealql/functions/ml/functions"),
277
278		// ── Scripting functions ──────────────────────────────────────
279		"script" | "scripting" | "embedded scripting" => {
280			Some("https://surrealdb.com/docs/surrealql/functions/script")
281		}
282
283		// ── Top-level pages ─────────────────────────────────────────
284		"operators" | "operator" => Some("https://surrealdb.com/docs/surrealql/operators"),
285		"parameters" | "param" | "$param" => {
286			Some("https://surrealdb.com/docs/surrealql/parameters")
287		}
288		"comments" | "comment" => Some("https://surrealdb.com/docs/surrealql/comments"),
289		"transactions" | "transaction" => Some("https://surrealdb.com/docs/surrealql/transactions"),
290		"demo" | "demo data" => Some("https://surrealdb.com/docs/surrealql/demo"),
291		"surrealql" => Some(BASE),
292
293		_ => None,
294	}
295}
296
297/// Known function namespace prefixes and their documentation URLs.
298const FUNCTION_NAMESPACES: &[(&str, &str)] = &[
299	(
300		"api::",
301		"https://surrealdb.com/docs/surrealql/functions/database/api",
302	),
303	(
304		"array::",
305		"https://surrealdb.com/docs/surrealql/functions/database/array",
306	),
307	(
308		"bytes::",
309		"https://surrealdb.com/docs/surrealql/functions/database/bytes",
310	),
311	(
312		"crypto::",
313		"https://surrealdb.com/docs/surrealql/functions/database/crypto",
314	),
315	(
316		"duration::",
317		"https://surrealdb.com/docs/surrealql/functions/database/duration",
318	),
319	(
320		"encoding::",
321		"https://surrealdb.com/docs/surrealql/functions/database/encoding",
322	),
323	(
324		"file::",
325		"https://surrealdb.com/docs/surrealql/functions/database/file",
326	),
327	(
328		"geo::",
329		"https://surrealdb.com/docs/surrealql/functions/database/geo",
330	),
331	(
332		"http::",
333		"https://surrealdb.com/docs/surrealql/functions/database/http",
334	),
335	(
336		"math::",
337		"https://surrealdb.com/docs/surrealql/functions/database/math",
338	),
339	(
340		"meta::",
341		"https://surrealdb.com/docs/surrealql/functions/database/meta",
342	),
343	(
344		"object::",
345		"https://surrealdb.com/docs/surrealql/functions/database/object",
346	),
347	(
348		"parse::",
349		"https://surrealdb.com/docs/surrealql/functions/database/parse",
350	),
351	(
352		"rand::",
353		"https://surrealdb.com/docs/surrealql/functions/database/rand",
354	),
355	(
356		"record::",
357		"https://surrealdb.com/docs/surrealql/functions/database/record",
358	),
359	(
360		"search::",
361		"https://surrealdb.com/docs/surrealql/functions/database/search",
362	),
363	(
364		"sequence::",
365		"https://surrealdb.com/docs/surrealql/functions/database/sequence",
366	),
367	(
368		"session::",
369		"https://surrealdb.com/docs/surrealql/functions/database/session",
370	),
371	(
372		"set::",
373		"https://surrealdb.com/docs/surrealql/functions/database/set",
374	),
375	(
376		"string::",
377		"https://surrealdb.com/docs/surrealql/functions/database/string",
378	),
379	(
380		"time::",
381		"https://surrealdb.com/docs/surrealql/functions/database/time",
382	),
383	(
384		"type::",
385		"https://surrealdb.com/docs/surrealql/functions/database/type",
386	),
387	(
388		"value::",
389		"https://surrealdb.com/docs/surrealql/functions/database/value",
390	),
391	(
392		"vector::",
393		"https://surrealdb.com/docs/surrealql/functions/database/vector",
394	),
395];
396
397/// Standalone functions (no namespace prefix) and their documentation URLs.
398const STANDALONE_FUNCTIONS: &[(&str, &str)] = &[
399	(
400		"count",
401		"https://surrealdb.com/docs/surrealql/functions/database/count",
402	),
403	(
404		"not",
405		"https://surrealdb.com/docs/surrealql/functions/database/not",
406	),
407	(
408		"sleep",
409		"https://surrealdb.com/docs/surrealql/functions/database/sleep",
410	),
411	(
412		"rand",
413		"https://surrealdb.com/docs/surrealql/functions/database/rand",
414	),
415];
416
417/// Get the documentation URL for a SurrealQL function by its full qualified name.
418///
419/// Matches namespaced functions like `"string::len"` or `"array::push"` to
420/// their namespace documentation page (e.g., the String functions page).
421///
422/// Also matches standalone functions like `"count"`, `"not"`, `"sleep"`, `"rand"`.
423///
424/// # Examples
425///
426/// ```
427/// use surql_parser::doc_urls::doc_url_for_function;
428///
429/// assert_eq!(
430///     doc_url_for_function("string::len"),
431///     Some("https://surrealdb.com/docs/surrealql/functions/database/string"),
432/// );
433/// assert_eq!(
434///     doc_url_for_function("array::push"),
435///     Some("https://surrealdb.com/docs/surrealql/functions/database/array"),
436/// );
437/// assert_eq!(
438///     doc_url_for_function("count"),
439///     Some("https://surrealdb.com/docs/surrealql/functions/database/count"),
440/// );
441/// assert_eq!(doc_url_for_function("unknown::thing"), None);
442/// ```
443pub fn doc_url_for_function(name: &str) -> Option<&'static str> {
444	let lower = name.to_lowercase();
445	let trimmed = lower.trim();
446
447	for &(prefix, url) in FUNCTION_NAMESPACES {
448		if trimmed.starts_with(prefix) || trimmed == prefix.trim_end_matches("::") {
449			return Some(url);
450		}
451	}
452
453	for &(standalone, url) in STANDALONE_FUNCTIONS {
454		if trimmed == standalone {
455			return Some(url);
456		}
457	}
458
459	None
460}
461
462#[cfg(test)]
463mod tests {
464	use super::*;
465
466	#[test]
467	fn should_resolve_statement_keywords() {
468		assert_eq!(
469			doc_url("SELECT"),
470			Some("https://surrealdb.com/docs/surrealql/statements/select")
471		);
472		assert_eq!(
473			doc_url("create"),
474			Some("https://surrealdb.com/docs/surrealql/statements/create")
475		);
476		assert_eq!(
477			doc_url("UPDATE"),
478			Some("https://surrealdb.com/docs/surrealql/statements/update")
479		);
480		assert_eq!(
481			doc_url("DELETE"),
482			Some("https://surrealdb.com/docs/surrealql/statements/delete")
483		);
484		assert_eq!(
485			doc_url("INSERT"),
486			Some("https://surrealdb.com/docs/surrealql/statements/insert")
487		);
488		assert_eq!(
489			doc_url("UPSERT"),
490			Some("https://surrealdb.com/docs/surrealql/statements/upsert")
491		);
492		assert_eq!(
493			doc_url("RELATE"),
494			Some("https://surrealdb.com/docs/surrealql/statements/relate")
495		);
496		assert_eq!(
497			doc_url("LET"),
498			Some("https://surrealdb.com/docs/surrealql/statements/let")
499		);
500		assert_eq!(
501			doc_url("LIVE SELECT"),
502			Some("https://surrealdb.com/docs/surrealql/statements/live")
503		);
504	}
505
506	#[test]
507	fn should_resolve_define_variants() {
508		assert_eq!(
509			doc_url("DEFINE TABLE"),
510			Some("https://surrealdb.com/docs/surrealql/statements/define/table")
511		);
512		assert_eq!(
513			doc_url("table"),
514			Some("https://surrealdb.com/docs/surrealql/statements/define/table")
515		);
516		assert_eq!(
517			doc_url("DEFINE FIELD"),
518			Some("https://surrealdb.com/docs/surrealql/statements/define/field")
519		);
520		assert_eq!(
521			doc_url("DEFINE INDEX"),
522			Some("https://surrealdb.com/docs/surrealql/statements/define/indexes")
523		);
524		assert_eq!(
525			doc_url("DEFINE NAMESPACE"),
526			Some("https://surrealdb.com/docs/surrealql/statements/define/namespace")
527		);
528		assert_eq!(
529			doc_url("DEFINE NS"),
530			Some("https://surrealdb.com/docs/surrealql/statements/define/namespace")
531		);
532	}
533
534	#[test]
535	fn should_resolve_alter_variants() {
536		assert_eq!(
537			doc_url("ALTER TABLE"),
538			Some("https://surrealdb.com/docs/surrealql/statements/alter/table")
539		);
540		assert_eq!(
541			doc_url("ALTER DATABASE"),
542			Some("https://surrealdb.com/docs/surrealql/statements/alter/database")
543		);
544		assert_eq!(
545			doc_url("ALTER DB"),
546			Some("https://surrealdb.com/docs/surrealql/statements/alter/database")
547		);
548		assert_eq!(
549			doc_url("ALTER SYSTEM"),
550			Some("https://surrealdb.com/docs/surrealql/statements/alter/system")
551		);
552	}
553
554	#[test]
555	fn should_resolve_clauses() {
556		assert_eq!(
557			doc_url("WHERE"),
558			Some("https://surrealdb.com/docs/surrealql/clauses/where")
559		);
560		assert_eq!(
561			doc_url("ORDER BY"),
562			Some("https://surrealdb.com/docs/surrealql/clauses/order-by")
563		);
564		assert_eq!(
565			doc_url("GROUP BY"),
566			Some("https://surrealdb.com/docs/surrealql/clauses/group-by")
567		);
568		assert_eq!(
569			doc_url("LIMIT"),
570			Some("https://surrealdb.com/docs/surrealql/clauses/limit")
571		);
572		assert_eq!(
573			doc_url("FETCH"),
574			Some("https://surrealdb.com/docs/surrealql/clauses/fetch")
575		);
576		assert_eq!(
577			doc_url("SPLIT"),
578			Some("https://surrealdb.com/docs/surrealql/clauses/split")
579		);
580	}
581
582	#[test]
583	fn should_resolve_data_types() {
584		assert_eq!(
585			doc_url("string"),
586			Some("https://surrealdb.com/docs/surrealql/datamodel/strings")
587		);
588		assert_eq!(
589			doc_url("number"),
590			Some("https://surrealdb.com/docs/surrealql/datamodel/numbers")
591		);
592		assert_eq!(
593			doc_url("datetime"),
594			Some("https://surrealdb.com/docs/surrealql/datamodel/datetimes")
595		);
596		assert_eq!(
597			doc_url("uuid"),
598			Some("https://surrealdb.com/docs/surrealql/datamodel/uuid")
599		);
600		assert_eq!(
601			doc_url("geometry"),
602			Some("https://surrealdb.com/docs/surrealql/datamodel/geometries")
603		);
604	}
605
606	#[test]
607	fn should_resolve_function_namespaces_via_doc_url() {
608		assert_eq!(
609			doc_url("string::"),
610			Some("https://surrealdb.com/docs/surrealql/functions/database/string")
611		);
612		assert_eq!(
613			doc_url("array::"),
614			Some("https://surrealdb.com/docs/surrealql/functions/database/array")
615		);
616		assert_eq!(
617			doc_url("math::"),
618			Some("https://surrealdb.com/docs/surrealql/functions/database/math")
619		);
620		assert_eq!(
621			doc_url("count"),
622			Some("https://surrealdb.com/docs/surrealql/functions/database/count")
623		);
624	}
625
626	#[test]
627	fn should_resolve_specific_functions() {
628		assert_eq!(
629			doc_url_for_function("string::len"),
630			Some("https://surrealdb.com/docs/surrealql/functions/database/string")
631		);
632		assert_eq!(
633			doc_url_for_function("array::push"),
634			Some("https://surrealdb.com/docs/surrealql/functions/database/array")
635		);
636		assert_eq!(
637			doc_url_for_function("math::sum"),
638			Some("https://surrealdb.com/docs/surrealql/functions/database/math")
639		);
640		assert_eq!(
641			doc_url_for_function("crypto::md5"),
642			Some("https://surrealdb.com/docs/surrealql/functions/database/crypto")
643		);
644		assert_eq!(
645			doc_url_for_function("time::now"),
646			Some("https://surrealdb.com/docs/surrealql/functions/database/time")
647		);
648		assert_eq!(
649			doc_url_for_function("count"),
650			Some("https://surrealdb.com/docs/surrealql/functions/database/count")
651		);
652	}
653
654	#[test]
655	fn should_resolve_standalone_function_as_namespace() {
656		assert_eq!(
657			doc_url_for_function("string"),
658			Some("https://surrealdb.com/docs/surrealql/functions/database/string")
659		);
660		assert_eq!(
661			doc_url_for_function("array"),
662			Some("https://surrealdb.com/docs/surrealql/functions/database/array")
663		);
664	}
665
666	#[test]
667	fn should_return_none_for_unknown() {
668		assert_eq!(doc_url("nonexistent"), None);
669		assert_eq!(doc_url_for_function("unknown::thing"), None);
670	}
671
672	#[test]
673	fn should_not_resolve_removed_3x_statements() {
674		assert_eq!(doc_url("define scope"), None);
675		assert_eq!(doc_url("scope"), None);
676		assert_eq!(doc_url("define token"), None);
677		assert_eq!(doc_url("token"), None);
678	}
679
680	#[test]
681	fn should_be_case_insensitive() {
682		assert_eq!(doc_url("SELECT"), doc_url("select"));
683		assert_eq!(doc_url("Where"), doc_url("where"));
684		assert_eq!(
685			doc_url_for_function("STRING::LEN"),
686			doc_url_for_function("string::len")
687		);
688	}
689
690	#[test]
691	fn should_resolve_top_level_pages() {
692		assert_eq!(
693			doc_url("operators"),
694			Some("https://surrealdb.com/docs/surrealql/operators")
695		);
696		assert_eq!(
697			doc_url("parameters"),
698			Some("https://surrealdb.com/docs/surrealql/parameters")
699		);
700		assert_eq!(
701			doc_url("transactions"),
702			Some("https://surrealdb.com/docs/surrealql/transactions")
703		);
704		assert_eq!(
705			doc_url("comments"),
706			Some("https://surrealdb.com/docs/surrealql/comments")
707		);
708	}
709}