use crate::Driver;
use crate::DriverMetadata;
use crate::registry::DriverCategory;
#[cfg(any(feature = "cryptography", feature = "all"))]
use crate::registry::cryptography_register;
#[cfg(any(feature = "email", feature = "all"))]
use crate::registry::email_register;
#[cfg(any(feature = "network", feature = "all"))]
use crate::registry::network_register;
#[cfg(any(feature = "scheduled_tasks", feature = "all"))]
use crate::registry::scheduled_tasks_register;
#[cfg(any(feature = "time", feature = "all"))]
use crate::registry::time_register;
use once_cell::sync::Lazy;
use serde_json::Value;
use std::collections::HashMap;
use std::sync::Arc;
use std::sync::RwLock;
#[cfg(any(feature = "application_control", feature = "all"))]
use crate::registry::application_register;
#[cfg(any(feature = "audio_control", feature = "all"))]
use crate::registry::audio_register;
#[cfg(any(feature = "helloworld", feature = "all"))]
use crate::registry::basic_register;
#[cfg(any(feature = "blockchain", feature = "all"))]
use crate::registry::blockchain_register;
#[cfg(any(feature = "bluetooth", feature = "all"))]
use crate::registry::bluetooth_register;
#[cfg(any(feature = "have_head_browser", feature = "all"))]
use crate::registry::browser_register;
#[cfg(any(feature = "database", feature = "all"))]
use crate::registry::database_register;
#[cfg(any(feature = "devops", feature = "all"))]
use crate::registry::devops_register;
#[cfg(any(feature = "display_control", feature = "all"))]
use crate::registry::display_register;
#[cfg(any(feature = "document", feature = "all"))]
use crate::registry::document_register;
#[cfg(any(feature = "file", feature = "all"))]
use crate::registry::file_register;
#[cfg(any(feature = "keyboard_control", feature = "all"))]
use crate::registry::keyboard_register;
#[cfg(any(feature = "math", feature = "all"))]
use crate::registry::math_register;
#[cfg(any(feature = "media", feature = "all"))]
use crate::registry::media_register;
#[cfg(any(feature = "mouse_control", feature = "all"))]
use crate::registry::mouse_register;
#[cfg(any(feature = "operating_system_cpu", feature = "all"))]
use crate::registry::operating_system_cpu_register;
#[cfg(any(feature = "operating_system_disk", feature = "all"))]
use crate::registry::operating_system_disk_register;
#[cfg(any(feature = "operating_system_gpu", feature = "all"))]
use crate::registry::operating_system_gpu_register;
#[cfg(any(feature = "operating_system_memory", feature = "all"))]
use crate::registry::operating_system_memory_register;
#[cfg(any(feature = "operating_system_process", feature = "all"))]
use crate::registry::operating_system_process_register;
#[cfg(any(feature = "operating_system_basis", feature = "all"))]
use crate::registry::operating_system_basis_register;
#[cfg(any(feature = "operating_system_security", feature = "all"))]
use crate::registry::operating_system_security_register;
#[cfg(any(feature = "operating_system_services", feature = "all"))]
use crate::registry::operating_system_services_register;
#[cfg(any(feature = "social_platform", feature = "all"))]
use crate::registry::socialplatform_register;
#[cfg(any(feature = "speech_speak", feature = "all"))]
use crate::registry::speech_speak_register;
#[cfg(any(feature = "terminal_commands", feature = "all"))]
use crate::registry::terminal_register;
#[cfg(any(feature = "text", feature = "all"))]
use crate::registry::text_register;
#[cfg(any(feature = "wifi", feature = "all"))]
use crate::registry::wifi_register;
#[cfg(any(feature = "window_control", feature = "all"))]
use crate::registry::window_register;
pub type DriverRegistryMap = HashMap<DriverCategory, HashMap<String, Arc<dyn Driver>>>;
static SKILL_REGISTRY: Lazy<RwLock<DriverRegistryMap>> = Lazy::new(|| {
let mut registry: DriverRegistryMap = HashMap::new();
#[cfg(any(feature = "helloworld", feature = "all"))]
basic_register::register(&mut registry);
#[cfg(any(feature = "file", feature = "all"))]
file_register::register(&mut registry);
#[cfg(any(feature = "math", feature = "all"))]
math_register::register(&mut registry);
#[cfg(any(feature = "network", feature = "all"))]
network_register::register(&mut registry);
#[cfg(any(feature = "operating_system_basis", feature = "all"))]
operating_system_basis_register::register(&mut registry);
#[cfg(any(feature = "document", feature = "all"))]
document_register::register(&mut registry);
#[cfg(any(feature = "social_platform", feature = "all"))]
socialplatform_register::register(&mut registry);
#[cfg(any(feature = "database", feature = "all"))]
database_register::register(&mut registry);
#[cfg(any(feature = "text", feature = "all"))]
text_register::register(&mut registry);
#[cfg(any(feature = "devops", feature = "all"))]
devops_register::register(&mut registry);
#[cfg(any(feature = "media", feature = "all"))]
media_register::register(&mut registry);
#[cfg(any(feature = "blockchain", feature = "all"))]
blockchain_register::register(&mut registry);
#[cfg(any(feature = "have_head_browser", feature = "all"))]
browser_register::register(&mut registry);
#[cfg(any(feature = "window_control", feature = "all"))]
window_register::register(&mut registry);
#[cfg(any(feature = "speech_speak", feature = "all"))]
speech_speak_register::register(&mut registry);
#[cfg(any(feature = "keyboard_control", feature = "all"))]
keyboard_register::register(&mut registry);
#[cfg(any(feature = "mouse_control", feature = "all"))]
mouse_register::register(&mut registry);
#[cfg(any(feature = "audio_control", feature = "all"))]
audio_register::register(&mut registry);
#[cfg(any(feature = "application_control", feature = "all"))]
application_register::register(&mut registry);
#[cfg(any(feature = "display_control", feature = "all"))]
display_register::register(&mut registry);
#[cfg(any(feature = "wifi", feature = "all"))]
wifi_register::register(&mut registry);
#[cfg(any(feature = "bluetooth", feature = "all"))]
bluetooth_register::register(&mut registry);
#[cfg(any(feature = "terminal_commands", feature = "all"))]
terminal_register::register(&mut registry);
#[cfg(any(feature = "cryptography", feature = "all"))]
cryptography_register::register(&mut registry);
#[cfg(any(feature = "time", feature = "all"))]
time_register::register(&mut registry);
#[cfg(any(feature = "email", feature = "all"))]
email_register::register(&mut registry);
#[cfg(any(feature = "operating_system_services", feature = "all"))]
operating_system_services_register::register(&mut registry);
#[cfg(any(feature = "operating_system_security", feature = "all"))]
operating_system_security_register::register(&mut registry);
#[cfg(any(feature = "scheduled_tasks", feature = "all"))]
scheduled_tasks_register::register(&mut registry);
#[cfg(any(feature = "operating_system_process", feature = "all"))]
operating_system_process_register::register(&mut registry);
#[cfg(any(feature = "operating_system_memory", feature = "all"))]
operating_system_memory_register::register(&mut registry);
#[cfg(any(feature = "operating_system_cpu", feature = "all"))]
operating_system_cpu_register::register(&mut registry);
#[cfg(any(feature = "operating_system_gpu", feature = "all"))]
operating_system_gpu_register::register(&mut registry);
#[cfg(any(feature = "operating_system_disk", feature = "all"))]
operating_system_disk_register::register(&mut registry);
RwLock::new(registry)
});
pub fn get_registry() -> std::sync::RwLockReadGuard<'static, DriverRegistryMap> {
SKILL_REGISTRY.read().unwrap()
}
pub fn get_registry_mut() -> std::sync::RwLockWriteGuard<'static, DriverRegistryMap> {
SKILL_REGISTRY.write().unwrap()
}
pub fn get_all_categorys() -> Vec<String> {
let registry = get_registry();
let mut result: Vec<String> = registry
.keys()
.map(|category| category.name().to_string())
.collect();
result.sort();
result
}
pub fn register_driver(category: DriverCategory, name: String, driver: Arc<dyn Driver>) {
let mut registry = get_registry_mut();
registry
.entry(category)
.or_insert_with(HashMap::new)
.insert(name, driver);
}
pub fn get_all_drivers() -> Vec<Arc<dyn Driver>> {
let registry = get_registry();
let mut drivers = Vec::new();
for category_map in registry.values() {
for driver in category_map.values() {
drivers.push(driver.clone());
}
}
drivers
}
pub fn get_driver_by_name(name: &str) -> Option<Arc<dyn Driver>> {
let registry = get_registry();
for category_map in registry.values() {
if let Some(driver) = category_map.get(name) {
return Some(driver.clone());
}
}
None
}
pub fn get_driver_by_name_and_category(
name: &str,
category: DriverCategory,
) -> Option<Arc<dyn Driver>> {
let registry = get_registry();
registry
.get(&category)
.and_then(|map| map.get(name))
.cloned()
}
pub fn has_driver(name: &str) -> bool {
get_driver_by_name(name).is_some()
}
pub fn list_drivers_names() -> Vec<String> {
let registry = get_registry();
let mut names = Vec::new();
for category_map in registry.values() {
names.extend(category_map.keys().cloned());
}
names
}
pub fn list_drivers_name_by_category(category: DriverCategory) -> Vec<String> {
let registry = get_registry();
registry
.get(&category)
.map(|map| map.keys().cloned().collect())
.unwrap_or_default()
}
pub fn get_driver_category() -> Vec<(String, usize)> {
let registry = get_registry();
let mut result = Vec::new();
for (category, map) in registry.iter() {
result.push((category.name().to_string(), map.len()));
}
result.sort_by(|a, b| a.0.cmp(&b.0));
result
}
pub fn get_driver_category_names() -> Vec<String> {
let registry = get_registry();
let mut result: Vec<String> = registry
.keys()
.map(|category| category.name().to_string())
.collect();
result.sort();
result
}
pub fn get_driver_category_name_and_describe() -> Vec<(String, String)> {
let registry = get_registry();
let mut result = Vec::new();
for category in registry.keys() {
let name = category.name().to_string();
let description = format!("{} - {}", category.display_name(), category.description());
result.push((name, description));
}
result.sort_by(|a, b| a.0.cmp(&b.0));
result
}
pub fn generate_registry_drivers_metadata() -> Vec<DriverMetadata> {
let registry = get_registry();
let mut metadata = Vec::new();
for category_map in registry.values() {
for driver in category_map.values() {
metadata.push(driver.get_metadata());
}
}
metadata
}
pub fn generate_total_drivers_registry_table_json() -> Value {
let metadata = generate_registry_drivers_metadata();
serde_json::json!({
"version": "1.0",
"total_drivers": metadata.len(),
"drivers": metadata,
"instruction": r#"You can call a driver by returning a JSON object with 'action' and 'parameters' fields. Example: {"action": "calculator", "parameters": {"expression": "2+3"}}"#
})
}
pub fn generate_driver_registry_table_json_str() -> String {
serde_json::to_string_pretty(&generate_total_drivers_registry_table_json()).unwrap()
}
pub fn get_drivers_by_category(category: &str) -> Vec<Arc<dyn Driver>> {
let Some(cat_enum) = DriverCategory::from_str(category) else {
return Vec::new();
};
let registry = get_registry();
registry
.get(&cat_enum)
.map(|map| map.values().cloned().collect())
.unwrap_or_default()
}
pub fn get_drivers_by_category_list(categories: &[String]) -> Vec<Arc<dyn Driver>> {
let registry = get_registry();
let mut result = Vec::new();
let enums: Vec<DriverCategory> = categories
.iter()
.filter_map(|cat| DriverCategory::from_str(cat))
.collect();
for cat_enum in enums {
if let Some(driver_map) = registry.get(&cat_enum) {
result.extend(driver_map.values().cloned());
}
}
result
}
pub fn list_drivers_name_by_category_list(categorys: &[String]) -> Vec<String> {
let registry = get_registry();
let mut result = Vec::new();
let enums: Vec<DriverCategory> = categorys
.iter()
.filter_map(|cat| DriverCategory::from_str(cat))
.collect();
for cat_enum in enums {
if let Some(driver_map) = registry.get(&cat_enum) {
result.extend(driver_map.keys().cloned());
}
}
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_get_driver_category() {
let category = get_driver_category_name_and_describe();
println!("category:{:?}", category);
}
}