omni_llm_kit/tool/
tool_registry.rs1use crate::{Tool, ToolDyn};
2use derive_more::{Deref, DerefMut};
3use parking_lot::RwLock;
4use rustc_hash::FxHashMap;
5use std::sync::Arc;
6
7#[derive(Default)]
8struct ToolRegistryState {
9 tools: FxHashMap<Arc<str>, Arc<dyn ToolDyn>>,
10}
11#[derive(Default)]
12pub struct ToolRegistry {
13 state: RwLock<ToolRegistryState>,
14}
15
16impl ToolRegistry {
17 pub fn new() -> Self {
18 Self {
19 state: RwLock::new(ToolRegistryState {
20 tools: FxHashMap::default(),
21 }),
22 }
23 }
24 pub fn tool(&self, name: &str) -> Option<Arc<dyn ToolDyn>> {
25 self.state.read().tools.get(name).cloned()
26 }
27 pub fn register_tool(&self, tool: impl ToolDyn + 'static) {
28 eprintln!("registering tool {:?}", tool.name());
29 let mut state = self.state.write();
30 let tool_name: Arc<str> = tool.name().into();
31 state.tools.insert(tool_name, Arc::new(tool));
32 }
33
34 pub fn tools(&self) -> Vec<Arc<dyn ToolDyn>> {
35 self.state.read().tools.values().cloned().collect()
36 }
37}