Skip to main content

sqry_plugin_registry/
lib.rs

1//! Shared plugin registry for SQRY
2//!
3//! This module provides a centralized function to create a `PluginManager` with all
4//! built-in language plugins registered. This is the single source of truth for
5//! the supported plugin roster, used by CLI, index, and other consumers.
6//!
7//! # Auto-registration of Built-in Plugins
8//!
9//! This module centralizes the registration of all 37 language plugins to ensure
10//! consistency across the entire ecosystem (CLI, LSP, MCP, etc.).
11
12use sqry_core::plugin::PluginManager;
13
14/// Create a `PluginManager` with all built-in language plugins registered.
15///
16/// This function registers all supported language plugins in a consistent order.
17///
18/// # Returns
19///
20/// A fully-initialized `PluginManager` ready for symbol extraction.
21///
22/// # Example
23///
24/// ```
25/// use sqry_plugin_registry::create_plugin_manager;
26///
27/// let plugin_manager = create_plugin_manager();
28/// assert!(plugin_manager.plugin_for_extension("rs").is_some());
29/// ```
30///
31/// # Plugin Registration Order
32///
33/// Plugins are registered in deterministic order:
34/// - General-purpose languages (alphabetical by language ID; 28 total)
35/// - Domain-specific languages (ordered as listed; 5 total: Oracle PL/SQL, Salesforce Apex, SAP ABAP, `ServiceNow` Xanadu, `ServiceNow` XML)
36/// - `IaC` plugins (3 total: terraform, puppet, pulumi)
37#[must_use]
38pub fn create_plugin_manager() -> PluginManager {
39    let mut pm = PluginManager::new();
40
41    // Tier 1 languages (28 languages with full call/import/export support)
42    pm.register_builtin(Box::new(sqry_lang_c::CPlugin::default()));
43    pm.register_builtin(Box::new(sqry_lang_cpp::CppPlugin::default()));
44    pm.register_builtin(Box::new(sqry_lang_csharp::CSharpPlugin::default()));
45    pm.register_builtin(Box::new(sqry_lang_css::CssPlugin::default()));
46    pm.register_builtin(Box::new(sqry_lang_dart::DartPlugin::default()));
47    pm.register_builtin(Box::new(sqry_lang_elixir::ElixirPlugin::default()));
48    pm.register_builtin(Box::new(sqry_lang_go::GoPlugin::default()));
49    pm.register_builtin(Box::new(sqry_lang_groovy::GroovyPlugin::default()));
50    pm.register_builtin(Box::new(sqry_lang_haskell::HaskellPlugin::default()));
51    pm.register_builtin(Box::new(sqry_lang_html::HtmlPlugin::default()));
52    pm.register_builtin(Box::new(sqry_lang_java::JavaPlugin::default()));
53    pm.register_builtin(Box::new(sqry_lang_javascript::JavaScriptPlugin::default()));
54    pm.register_builtin(Box::new(sqry_lang_kotlin::KotlinPlugin::default()));
55    pm.register_builtin(Box::new(sqry_lang_lua::LuaPlugin::default()));
56    pm.register_builtin(Box::new(sqry_lang_perl::PerlPlugin::default()));
57    pm.register_builtin(Box::new(sqry_lang_php::PhpPlugin::default()));
58    pm.register_builtin(Box::new(sqry_lang_python::PythonPlugin::default()));
59    pm.register_builtin(Box::new(sqry_lang_r::RPlugin::default()));
60    pm.register_builtin(Box::new(sqry_lang_ruby::RubyPlugin::default()));
61    pm.register_builtin(Box::new(sqry_lang_rust::RustPlugin::default()));
62    pm.register_builtin(Box::new(sqry_lang_scala::ScalaPlugin::default()));
63    pm.register_builtin(Box::new(sqry_lang_shell::ShellPlugin::default()));
64    pm.register_builtin(Box::new(sqry_lang_sql::SqlPlugin::default()));
65    pm.register_builtin(Box::new(sqry_lang_svelte::SveltePlugin::default()));
66    pm.register_builtin(Box::new(sqry_lang_swift::SwiftPlugin::default()));
67    pm.register_builtin(Box::new(sqry_lang_typescript::TypeScriptPlugin::default()));
68    pm.register_builtin(Box::new(sqry_lang_vue::VuePlugin::default()));
69    pm.register_builtin(Box::new(sqry_lang_zig::ZigPlugin::default()));
70
71    // Domain-specific plugins
72    pm.register_builtin(Box::new(
73        sqry_lang_oracle_plsql::OraclePlsqlPlugin::default(),
74    ));
75    pm.register_builtin(Box::new(
76        sqry_lang_salesforce_apex::SalesforceApexPlugin::default(),
77    ));
78    pm.register_builtin(Box::new(sqry_lang_sap_abap::SapAbapPlugin::default()));
79    pm.register_builtin(Box::new(
80        sqry_lang_servicenow_xanadu::ServiceNowXanaduPlugin::default(),
81    ));
82    pm.register_builtin(Box::new(
83        sqry_lang_servicenow_xml::ServiceNowXmlPlugin::default(),
84    ));
85
86    // IaC plugins (formerly feature-gated, now always included)
87    pm.register_builtin(Box::new(sqry_lang_terraform::TerraformPlugin::default()));
88    pm.register_builtin(Box::new(sqry_lang_puppet::PuppetPlugin::default()));
89    pm.register_builtin(Box::new(sqry_lang_pulumi::PulumiPlugin::default()));
90
91    // Config file plugins
92    pm.register_builtin(Box::new(sqry_lang_json::JsonPlugin::new()));
93
94    pm
95}
96
97#[cfg(test)]
98mod tests {
99    use super::*;
100
101    #[test]
102    fn test_create_plugin_manager_has_all_plugins() {
103        let pm = create_plugin_manager();
104        let plugins = pm.plugins();
105
106        // Should have 37 plugins (28 general-purpose + 5 domain-specific + 3 IaC + 1 config)
107        assert_eq!(
108            plugins.len(),
109            37,
110            "Expected 37 plugins, got {}",
111            plugins.len()
112        );
113    }
114
115    #[test]
116    fn test_create_plugin_manager_has_rust() {
117        let pm = create_plugin_manager();
118        assert!(pm.plugin_for_extension("rs").is_some());
119        assert!(pm.plugin_by_id("rust").is_some());
120    }
121
122    #[test]
123    fn test_create_plugin_manager_has_javascript() {
124        let pm = create_plugin_manager();
125        assert!(pm.plugin_for_extension("js").is_some());
126        assert!(pm.plugin_by_id("javascript").is_some());
127    }
128
129    #[test]
130    fn test_create_plugin_manager_has_python() {
131        let pm = create_plugin_manager();
132        assert!(pm.plugin_for_extension("py").is_some());
133        assert!(pm.plugin_by_id("python").is_some());
134    }
135
136    #[test]
137    fn test_create_plugin_manager_has_elixir() {
138        let pm = create_plugin_manager();
139        assert!(pm.plugin_for_extension("ex").is_some());
140        assert!(pm.plugin_by_id("elixir").is_some());
141    }
142
143    #[test]
144    fn test_create_plugin_manager_has_sql() {
145        let pm = create_plugin_manager();
146        assert!(pm.plugin_for_extension("sql").is_some());
147        assert!(pm.plugin_by_id("sql").is_some());
148    }
149
150    #[test]
151    fn test_create_plugin_manager_has_zig() {
152        let pm = create_plugin_manager();
153        assert!(pm.plugin_for_extension("zig").is_some());
154        assert!(pm.plugin_by_id("zig").is_some());
155    }
156}