use sqry_core::plugin::{PluginError, PluginManager};
#[must_use]
pub fn with_builtin_plugins() -> PluginManager {
try_with_builtin_plugins().expect(
"Failed to initialize built-in plugins - this indicates a plugin implementation bug",
)
}
pub fn try_with_builtin_plugins() -> Result<PluginManager, PluginError> {
let mut manager = PluginManager::new();
manager.register_builtin(Box::new(sqry_lang_go::GoPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_java::JavaPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_javascript::JavaScriptPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_python::PythonPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_rust::RustPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_swift::SwiftPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_typescript::TypeScriptPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_kotlin::KotlinPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_lua::LuaPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_php::PhpPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_r::RPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_ruby::RubyPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_scala::ScalaPlugin::default()));
let expected_count = 13;
let actual_count = manager.plugins().len();
if actual_count != expected_count {
return Err(PluginError::InvalidPlugin(format!(
"Plugin roster mismatch: expected {expected_count} plugins, got {actual_count}"
)));
}
Ok(manager)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_builtin_roster_integrity() {
let result = try_with_builtin_plugins();
assert!(
result.is_ok(),
"Built-in plugin roster should load successfully"
);
let manager = result.unwrap();
assert_eq!(
manager.plugins().len(),
13,
"Expected exactly 13 built-in plugins (Tier 1 + Tier 2, excluding NOT READY plugins)"
);
let loaded_ids: Vec<String> = manager
.plugins()
.iter()
.map(|p| p.metadata().id.to_string())
.collect();
for id in &["go", "java", "javascript", "python", "rust", "typescript"] {
assert!(
loaded_ids.contains(&(*id).to_string()),
"Expected {id} plugin to be loaded"
);
}
}
#[test]
fn test_fallible_factory() {
let result = try_with_builtin_plugins();
assert!(result.is_ok(), "try_with_builtin_plugins() should succeed");
let manager = result.unwrap();
assert!(
!manager.plugins().is_empty(),
"Manager should have plugins loaded"
);
assert_eq!(
manager.plugins().len(),
13,
"Expected 13 plugins to be loaded"
);
let rust_plugin = manager.plugin_for_extension("rs");
assert!(rust_plugin.is_some(), "Rust plugin should be available");
let rust_meta = rust_plugin.unwrap().metadata();
assert_eq!(rust_meta.id, "rust", "Rust plugin ID should be 'rust'");
}
#[test]
fn test_with_builtin_plugins_succeeds_normally() {
let manager = with_builtin_plugins();
assert!(
!manager.plugins().is_empty(),
"Manager should have plugins loaded"
);
assert_eq!(
manager.plugins().len(),
13,
"Expected 13 plugins (same as try_ variant)"
);
assert!(
manager.plugin_for_extension("rs").is_some(),
"Rust plugin should be available"
);
assert!(
manager.plugin_by_id("javascript").is_some(),
"JavaScript plugin should be available by ID"
);
}
}