Skip to main content

alef_backend_php/
naming.rs

1//! PHP-specific naming helpers for `ResolvedCrateConfig`.
2
3use alef_core::config::ResolvedCrateConfig;
4
5/// Get the PHP Composer autoload namespace.
6///
7/// If `[crates.php] namespace` is configured, uses that verbatim.
8/// Otherwise, derives the namespace from the extension name (e.g. `html_to_markdown_rs` → `Html\\To\\Markdown\\Rs`).
9pub fn php_autoload_namespace(config: &ResolvedCrateConfig) -> String {
10    use heck::ToPascalCase;
11
12    // Respect explicit namespace configuration
13    if let Some(php_cfg) = &config.php {
14        if let Some(ns) = &php_cfg.namespace {
15            return ns.clone();
16        }
17    }
18
19    // Fall back to derived namespace from extension name
20    let ext = config.php_extension_name();
21    if ext.contains('_') {
22        ext.split('_')
23            .map(|p| p.to_pascal_case())
24            .collect::<Vec<_>>()
25            .join("\\")
26    } else {
27        ext.to_pascal_case()
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34    use alef_core::config::new_config::NewAlefConfig;
35
36    fn resolved_one(toml: &str) -> ResolvedCrateConfig {
37        let cfg: NewAlefConfig = toml::from_str(toml).unwrap();
38        cfg.resolve().unwrap().remove(0)
39    }
40
41    fn minimal() -> ResolvedCrateConfig {
42        resolved_one(
43            r#"
44[workspace]
45languages = ["php"]
46
47[[crates]]
48name = "test-lib"
49sources = ["src/lib.rs"]
50"#,
51        )
52    }
53
54    #[test]
55    fn php_autoload_namespace_converts_snake_to_pascal_parts() {
56        let r = minimal();
57        // "test-lib" → php_extension_name → "test_lib" → "Test\\Lib"
58        assert_eq!(php_autoload_namespace(&r), "Test\\Lib");
59    }
60
61    #[test]
62    fn php_autoload_namespace_no_underscore_returns_single_pascal() {
63        let r = resolved_one(
64            r#"
65[workspace]
66languages = ["php"]
67
68[[crates]]
69name = "mylib"
70sources = ["src/lib.rs"]
71"#,
72        );
73        // "mylib" → php_extension_name → "mylib" → "Mylib"
74        assert_eq!(php_autoload_namespace(&r), "Mylib");
75    }
76
77    #[test]
78    fn php_autoload_namespace_explicit_extension_name() {
79        let r = resolved_one(
80            r#"
81[workspace]
82languages = ["php"]
83
84[[crates]]
85name = "test-lib"
86sources = ["src/lib.rs"]
87
88[crates.php]
89extension_name = "html_to_markdown_rs"
90"#,
91        );
92        assert_eq!(php_autoload_namespace(&r), "Html\\To\\Markdown\\Rs");
93    }
94
95    #[test]
96    fn php_autoload_namespace_explicit_namespace_override() {
97        let r = resolved_one(
98            r#"
99[workspace]
100languages = ["php"]
101
102[[crates]]
103name = "html-to-markdown"
104sources = ["src/lib.rs"]
105
106[crates.php]
107extension_name = "html_to_markdown_rs"
108namespace = "HtmlToMarkdown"
109"#,
110        );
111        assert_eq!(php_autoload_namespace(&r), "HtmlToMarkdown");
112    }
113}