Skip to main content

surrealdb_sql/
analyzer_function.rs

1//! Helpers for analyzer `FUNCTION` clause references (`fn::` and `mod::`).
2
3use common::fmt::EscapeKwFreeIdent;
4use surrealdb_types::{SqlFormat, ToSql, write_sql};
5
6/// Returns the fully qualified function name for display in errors.
7pub fn qualified_name(name: &str) -> String {
8	if name.starts_with("mod::") || name.starts_with("fn::") {
9		name.to_owned()
10	} else {
11		format!("fn::{name}")
12	}
13}
14
15pub fn fmt_analyzer_function(f: &mut String, sql_fmt: SqlFormat, name: &str) {
16	let (kind, path) = if let Some(rest) = name.strip_prefix("mod::") {
17		("mod", rest)
18	} else if let Some(rest) = name.strip_prefix("fn::") {
19		("fn", rest)
20	} else {
21		("fn", name)
22	};
23
24	write_sql!(f, sql_fmt, " FUNCTION {kind}");
25	for segment in path.split("::") {
26		f.push_str("::");
27		EscapeKwFreeIdent(segment).fmt_sql(f, sql_fmt);
28	}
29}
30
31#[cfg(test)]
32mod tests {
33	use surrealdb_types::SqlFormat;
34
35	use super::*;
36
37	#[test]
38	fn qualified_name_legacy_fn_suffix() {
39		assert_eq!(qualified_name("foo::bar"), "fn::foo::bar");
40	}
41
42	#[test]
43	fn qualified_name_mod_prefix() {
44		assert_eq!(qualified_name("mod::demo::alter"), "mod::demo::alter");
45	}
46
47	#[test]
48	fn fmt_analyzer_function_fn() {
49		let mut sql = String::new();
50		fmt_analyzer_function(&mut sql, SqlFormat::SingleLine, "foo::bar");
51		assert_eq!(sql, " FUNCTION fn::foo::bar");
52	}
53
54	#[test]
55	fn fmt_analyzer_function_mod() {
56		let mut sql = String::new();
57		fmt_analyzer_function(&mut sql, SqlFormat::SingleLine, "mod::demo::alter");
58		assert_eq!(sql, " FUNCTION mod::demo::alter");
59	}
60}